Указатель на статический буфер от предыдущего вызова используется несмотря на последующий вызов, который изменяет буфер
Неправильное употребление возвращаемого значения от неповторно используемой стандартной функции происходит, когда эти события происходят в этой последовательности:
Вы указываете на буфер, возвращенный в неповторно используемую стандартную функцию, такую как 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