Merge pull request #21 from seleznevae/ctype-functions-#20
[F] Fix undefined behavior due to incorrect usage of isprint
This commit is contained in:
commit
5731d45ae1
@ -1,6 +1,6 @@
|
|||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 3.0)
|
||||||
|
|
||||||
project(libfort VERSION 0.3.1)
|
project(libfort VERSION 0.3.2)
|
||||||
|
|
||||||
string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)"
|
string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)"
|
||||||
"\\1.\\2" libfort_SOVERSION
|
"\\1.\\2" libfort_SOVERSION
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
## v0.3.2
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- Fix undefined behavior due to incorrect usage of `isprint` function.
|
||||||
|
|
||||||
## v0.3.1
|
## v0.3.1
|
||||||
|
|
||||||
### Bug fixes
|
### Bug fixes
|
||||||
|
13
lib/fort.c
13
lib/fort.c
@ -2582,7 +2582,6 @@ SOFTWARE.
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
/* #include "vector.h" */ /* Commented by amalgamation script */
|
/* #include "vector.h" */ /* Commented by amalgamation script */
|
||||||
/* #include "fort_utils.h" */ /* Commented by amalgamation script */
|
/* #include "fort_utils.h" */ /* Commented by amalgamation script */
|
||||||
@ -5416,10 +5415,14 @@ int print_row_separator_impl(f_conv_context_t *cntx,
|
|||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
/* If all chars are not printable, skip line separator */
|
/* If all chars are not printable, skip line separator */
|
||||||
if ((strlen(*L) == 0 || (strlen(*L) == 1 && !isprint(**L)))
|
/* NOTE: argument of `isprint` should be explicitly converted to
|
||||||
&& (strlen(*I) == 0 || (strlen(*I) == 1 && !isprint(**I)))
|
* unsigned char according to
|
||||||
&& (strlen(*IV) == 0 || (strlen(*IV) == 1 && !isprint(**IV)))
|
* https://en.cppreference.com/w/c/string/byte/isprint
|
||||||
&& (strlen(*R) == 0 || (strlen(*R) == 1 && !isprint(**R)))) {
|
*/
|
||||||
|
if ((strlen(*L) == 0 || (strlen(*L) == 1 && !isprint((unsigned char) **L)))
|
||||||
|
&& (strlen(*I) == 0 || (strlen(*I) == 1 && !isprint((unsigned char) **I)))
|
||||||
|
&& (strlen(*IV) == 0 || (strlen(*IV) == 1 && !isprint((unsigned char) **IV)))
|
||||||
|
&& (strlen(*R) == 0 || (strlen(*R) == 1 && !isprint((unsigned char) **R)))) {
|
||||||
status = 0;
|
status = 0;
|
||||||
goto clear;
|
goto clear;
|
||||||
}
|
}
|
||||||
|
@ -46,8 +46,8 @@ SOFTWARE.
|
|||||||
|
|
||||||
#define LIBFORT_MAJOR_VERSION 0
|
#define LIBFORT_MAJOR_VERSION 0
|
||||||
#define LIBFORT_MINOR_VERSION 3
|
#define LIBFORT_MINOR_VERSION 3
|
||||||
#define LIBFORT_REVISION 0
|
#define LIBFORT_REVISION 2
|
||||||
#define LIBFORT_VERSION_STR "0.3.0"
|
#define LIBFORT_VERSION_STR "0.3.2"
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
@ -46,8 +46,8 @@ SOFTWARE.
|
|||||||
|
|
||||||
#define LIBFORT_MAJOR_VERSION 0
|
#define LIBFORT_MAJOR_VERSION 0
|
||||||
#define LIBFORT_MINOR_VERSION 3
|
#define LIBFORT_MINOR_VERSION 3
|
||||||
#define LIBFORT_REVISION 1
|
#define LIBFORT_REVISION 2
|
||||||
#define LIBFORT_VERSION_STR "0.3.1"
|
#define LIBFORT_VERSION_STR "0.3.2"
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
@ -31,7 +31,6 @@ SOFTWARE.
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
#include "fort_utils.h"
|
#include "fort_utils.h"
|
||||||
|
12
src/row.c
12
src/row.c
@ -353,10 +353,14 @@ int print_row_separator_impl(f_conv_context_t *cntx,
|
|||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
/* If all chars are not printable, skip line separator */
|
/* If all chars are not printable, skip line separator */
|
||||||
if ((strlen(*L) == 0 || (strlen(*L) == 1 && !isprint(**L)))
|
/* NOTE: argument of `isprint` should be explicitly converted to
|
||||||
&& (strlen(*I) == 0 || (strlen(*I) == 1 && !isprint(**I)))
|
* unsigned char according to
|
||||||
&& (strlen(*IV) == 0 || (strlen(*IV) == 1 && !isprint(**IV)))
|
* https://en.cppreference.com/w/c/string/byte/isprint
|
||||||
&& (strlen(*R) == 0 || (strlen(*R) == 1 && !isprint(**R)))) {
|
*/
|
||||||
|
if ((strlen(*L) == 0 || (strlen(*L) == 1 && !isprint((unsigned char) **L)))
|
||||||
|
&& (strlen(*I) == 0 || (strlen(*I) == 1 && !isprint((unsigned char) **I)))
|
||||||
|
&& (strlen(*IV) == 0 || (strlen(*IV) == 1 && !isprint((unsigned char) **IV)))
|
||||||
|
&& (strlen(*R) == 0 || (strlen(*R) == 1 && !isprint((unsigned char) **R)))) {
|
||||||
status = 0;
|
status = 0;
|
||||||
goto clear;
|
goto clear;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user