ISO/IEC TS 17961 [libptr]
Forming invalid pointers by library function
Description
Rule Definition
Forming invalid pointers by library function.1
Polyspace Implementation
This checker checks for these issues:
Use of path manipulation function without maximum sized buffer checking.
Invalid use of standard library memory routine.
Invalid use of standard library string routine.
Destination buffer overflow in string manipulation.
Examples
Use of path manipulation function without maximum sized buffer checking
Use of path manipulation function without
maximum-sized buffer checking occurs when the destination
argument of a path manipulation function such as realpath
or getwd
has
a buffer size less than PATH_MAX
bytes.
A buffer smaller than PATH_MAX
bytes can
overflow but you cannot test the function return value to determine
if an overflow occurred. If an overflow occurs, following the function
call, the content of the buffer is undefined.
For instance, char *getwd(char *buf)
copies
an absolute path name of the current folder to its argument. If the
length of the absolute path name is greater than PATH_MAX
bytes, getwd
returns NULL
and
the content of *buf
is undefined. You can test
the return value of getwd
for NULL
to
see if the function call succeeded.
However, if the allowed buffer for buf
is
less than PATH_MAX
bytes, a failure can occur for
a smaller absolute path name. In this case, getwd
does
not return NULL
even though a failure occurred.
Therefore, the allowed buffer for buf
must be PATH_MAX
bytes
long.
Possible fixes are:
Use a buffer size of
PATH_MAX
bytes. If you obtain the buffer from an unknown source, before using the buffer as argument ofgetwd
orrealpath
function, make sure that the size is less thanPATH_MAX
bytes.Use a path manipulation function that allows you to specify a buffer size.
For instance, if you are using
getwd
to get the absolute path name of the current folder, usechar *getcwd(char *buf, size_t size);
instead. The additional argumentsize
allows you to specify a size greater than or equal toPATH_MAX
.Allow the function to allocate additional memory dynamically, if possible.
For instance,
char *realpath(const char *path, char *resolved_path);
dynamically allocates memory ifresolved_path
isNULL
. However, you have to deallocate this memory later using thefree
function.
getwd
Function#include <unistd.h>
#include <linux/limits.h>
#include <stdio.h>
void func(void) {
char buf[PATH_MAX];
if (getwd(buf+1)!= NULL) {
printf("cwd is %s\n", buf);
}
}
In this example, although the array buf
has PATH_MAX
bytes,
the argument of getwd
is buf + 1
,
whose allowed buffer is less than PATH_MAX
bytes.
PATH_MAX
BytesOne possible correction is to use an array argument with size
equal to PATH_MAX
bytes.
#include <unistd.h> #include <linux/limits.h> #include <stdio.h> void func(void) { char buf[PATH_MAX]; if (getwd(buf)!= NULL) { printf("cwd is %s\n", buf); } }
Invalid use of standard library memory routine
Invalid use of standard library memory routine occurs when a
memory library function is called with invalid arguments. For instance, the
memcpy
function copies to an array that cannot accommodate the
number of bytes copied.
Use of a memory library function with invalid arguments can result in issues such as buffer overflow.
The fix depends on the root cause of the defect. Often the result details show a sequence of events that led to the defect. You can implement the fix on any event in the sequence. If the result details do not show the event history, you can trace back using right-click options in the source code and see previous related events. See also Interpret Bug Finder Results in Polyspace Desktop User Interface.
See examples of fixes below.
If you do not want to fix the issue, add comments to your result or code to avoid another review. See:
Address Results in Polyspace User Interface Through Bug Fixes or Justifications if you review results in the Polyspace user interface.
Address Results in Polyspace Access Through Bug Fixes or Justifications (Polyspace Access) if you review results in a web browser.
Annotate Code and Hide Known or Acceptable Results if you review results in an IDE.
#include <string.h>
#include <stdio.h>
char* Copy_First_Six_Letters(void)
{
char str1[10],str2[5];
printf("Enter string:\n");
scanf("%s",str1);
memcpy(str2,str1,6);
/* Defect: Arguments of memcpy invalid: str2 has size < 6 */
return str2;
}
The size of string str2
is
5, but six characters of string str1
are copied
into str2
using the memcpy
function.
One possible correction is to adjust the size
of str2
so that it accommodates the characters
copied with the memcpy
function.
#include <string.h> #include <stdio.h> char* Copy_First_Six_Letters(void) { /* Fix: Declare str2 with size 6 */ char str1[10],str2[6]; printf("Enter string:\n"); scanf("%s",str1); memcpy(str2,str1,6); return str2; }
Invalid use of standard library string routine
Invalid use of standard library string routine occurs when a string library function is called with invalid arguments.
The risk depends on the type of invalid arguments. For instance, using the
strcpy
function with a source argument larger than the
destination argument can result in buffer overflows.
The fix depends on the standard library
function involved in the defect. In some cases, you can constrain the function
arguments before the function call. For instance, if the
strcpy
function:
char * strcpy(char * destination, const char* source);
strcpy
. In some cases, you can use an alternative
function to avoid the error. For instance, instead of strcpy
,
you can use strncpy
to control the number of bytes copied.
See also Interpret Bug Finder Results in Polyspace Desktop User Interface.See examples of fixes below.
If you do not want to fix the issue, add comments to your result or code to avoid another review. See:
Address Results in Polyspace User Interface Through Bug Fixes or Justifications if you review results in the Polyspace user interface.
Address Results in Polyspace Access Through Bug Fixes or Justifications (Polyspace Access) if you review results in a web browser.
Annotate Code and Hide Known or Acceptable Results if you review results in an IDE.
#include <string.h>
#include <stdio.h>
char* Copy_String(void)
{
char *res;
char gbuffer[5],text[20]="ABCDEFGHIJKL";
res=strcpy(gbuffer,text);
/* Error: Size of text is less than gbuffer */
return(res);
}
The string text
is larger
in size than gbuffer
. Therefore, the function strcpy
cannot
copy text
into gbuffer
.
One possible correction is to declare the destination
string gbuffer
with equal or larger size than the
source string text
.
#include <string.h> #include <stdio.h> char* Copy_String(void) { char *res; /*Fix: gbuffer has equal or larger size than text */ char gbuffer[20],text[20]="ABCDEFGHIJKL"; res=strcpy(gbuffer,text); return(res); }
Destination buffer overflow in string manipulation
Destination buffer overflow in string manipulation occurs when certain string manipulation functions write to their destination buffer argument at an offset greater than the buffer size.
For instance, when calling the function sprintf(char*
buffer, const char* format)
, you use a constant string format
of
greater size than buffer
.
Buffer overflow can cause unexpected behavior such as memory corruption or stopping your system. Buffer overflow also introduces the risk of code injection.
One possible solution is to use alternative functions to constrain the number of characters written. For instance:
If you use
sprintf
to write formatted data to a string, usesnprintf
,_snprintf
orsprintf_s
instead to enforce length control. Alternatively, useasprintf
to automatically allocate the memory required for the destination buffer.If you use
vsprintf
to write formatted data from a variable argument list to a string, usevsnprintf
orvsprintf_s
instead to enforce length control.If you use
wcscpy
to copy a wide string, usewcsncpy
,wcslcpy
, orwcscpy_s
instead to enforce length control.
Another possible solution is to increase the buffer size.
sprintf
Use#include <stdio.h>
void func(void) {
char buffer[20];
char *fmt_string = "This is a very long string, it does not fit in the buffer";
sprintf(buffer, fmt_string);
}
In this example, buffer
can contain 20 char
elements
but fmt_string
has a greater size.
snprintf
Instead
of sprintf
One possible correction is to use the snprintf
function
to enforce length control.
#include <stdio.h> void func(void) { char buffer[20]; char *fmt_string = "This is a very long string, it does not fit in the buffer"; snprintf(buffer, 20, fmt_string); }
Check Information
Decidability: Undecidable |
Version History
Introduced in R2019a
1 Extracts from the standard "ISO/IEC TS 17961 Technical Specification - 2013-11-15" are reproduced with the agreement of AFNOR. Only the original and complete text of the standard, as published by AFNOR Editions - accessible via the website www.boutique.afnor.org - has normative value.
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)