Указатель на статический буфер от предыдущего вызова используется, несмотря на последующий вызов, который изменяет буфер
Этот дефект возникает, когда эти события происходят в этой последовательности:
Вы указываете на буфер, возвращенный от невходящей стандартной функции, такой как getenv
или setlocale
.
user = getenv("USER");
Вы снова вызываете эту невходящую стандартную функцию.
user2 = getenv("USER2");
Вы используете или высмеиваете указатель на первом шаге, ожидая, что буфер останется неизмененным со времени этого шага. Тем временем вызов на втором этапе изменил буфер.
Для образца:
var=*user;
В некоторых случаях дефект может появиться, даже если вы не вызываете getenv
выполняйте функцию во второй раз, но просто возвращайте указатель мыши. Для образца:
char* func() { user=getenv("USER"); . . return user; }
Для получения информации о том, какие функции покрываются этим дефектом, смотрите документацию о невходящих стандартных функциях.
Стандарт C допускает невходящие функции, такие как getenv
для возврата указателя на статический буфер. Поскольку буфер статический, второй вызов для getenv
изменяет буфер. Если вы продолжите использовать указатель, возвращенный после первого вызова после второго вызова, можно увидеть неожиданные результаты. Буфер, на который он указывает, больше не имеет значений от первого вызова.
Дефект появляется, даже если вы не вызываете getenv
второй раз, но просто верните указатель мыши. Причина в том, что кто-то, вызывающий вашу функцию, может использовать возвращенный указатель после второго вызова getenv
. Возвращая указатель из вызова в getenv
Вы делаете свою функцию небезопасной для использования.
То же обоснование верно и для других невходящих функций, охватываемых этим дефектом.
После первого вызова в getenv
, создайте копию буфера, на который указывает возвращенный указатель. После второго вызова в getenv
, используйте эту копию. Даже если второй вызов изменяет буфер, ваша копия нетронута.
Группа: Программирование |
Язык: C | C++ |
По умолчанию: Off |
Синтаксис командной строки: NON_REENTRANT_STD_RETURN |
Влияние: Высокий |
Find defects (-checkers)
| Modification of internal buffer returned from nonreentrant standard function
| Use of obsolete standard function