Испорченные строки передаются функции копирования строки
Испорченный NULL или не пустая отключенная строка ищет строки из небезопасных источников, которые используются в стандартных программах обработки строк, которые неявно разыменовывают буфер строки. Например, strcpy
или sprintf
.
Испорченный NULL или не пустая отключенная строка не повышает дефекта для строки, возвращенной от вызова до scanf
- семейство variadic функции. Точно так же никакой дефект не повышен, когда вы передаете строку со спецификатором %s
к printf
- семейство variadic функции.
Если вы ссылаетесь на строку с помощью формы ptr[i]
, *ptr
или адресная арифметика с указателями, Средство поиска Ошибки повышает Использование испорченного дефекта указателя вместо этого. Испорченный NULL или не пустой отключенный дефект строки повышен только, когда указатель используется в качестве строки.
Если строка из небезопасного источника, возможно, что атакующий управлял строкой или указал указатель строки на различную ячейку памяти.
Если строкой является NULL, стандартная программа строки не может разыменовать строку, заставив программу отказать. Если строка не отключена пустым указателем, строка, которую знает стандартная сила не, когда строка заканчивается. Эта ошибка может заставить вас писать за пределы, вызвав переполнение буфера.
Подтвердите строку, прежде чем вы будете использовать ее. Проверяйте что:
Строка не является ПУСТОЙ.
Строка отключена пустым указателем
Размер строки совпадает с ожидаемым размером.
#include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE128 128 extern void print_str(const char*); void warningMsg(char* userstr) { char str[SIZE128] = "Warning: "; strncat(str, userstr, SIZE128-(strlen(str)+1)); print_str(str); } void errorMsg(char* userstr) { char str[SIZE128] = "Error: "; strncat(str, userstr, SIZE128-(strlen(str)+1)); print_str(str); }
В этом примере строка str
конкатенирован с аргументом userstr
. Значение userstr
неизвестно. Если размер userstr
больше, чем доступный пробел, переполнение конкатенации.
Одно возможное исправление должно проверять размер userstr
и убедиться, что строка отключена пустым указателем перед использованием его в strncat
. Этот пример использует функцию помощника, sansitize_str
, чтобы подтвердить строку. Дефекты сконцентрированы в этой функции.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE128 128
extern void print_str(const char*);
int sanitize_str(char* s) {
int res = 0;
if (s && (strlen(s) > 0)) { // TAINTED_STRING only flagged here
// - string is not null
// - string has a positive and limited size
// - TAINTED_STRING on strlen used as a firewall
res = 1;
}
return res;
}
void warningMsg(char* userstr)
{
char str[SIZE128] = "Warning: ";
if (sanitize_str(userstr))
strncat(str, userstr, SIZE128-(strlen(str)+1));
print_str(str);
}
void errorMsg(char* userstr)
{
char str[SIZE128] = "Error: ";
if (sanitize_str(userstr))
strncat(str, userstr, SIZE128-(strlen(str)+1));
print_str(str);
}
Другое возможное исправление должно вызвать функциональный errorMsg
и warningMsg
с определенными строками.
#include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE128 128 extern void print_str(const char*); void warningMsg(char* userstr) { char str[SIZE128] = "Warning: "; strncat(str, userstr, SIZE128-(strlen(str)+1)); print_str(str); } void errorMsg(char* userstr) { char str[SIZE128] = "Error: "; strncat(str, userstr, SIZE128-(strlen(str)+1)); print_str(str); } int manageSensorValue(int sensorValue) { int ret = sensorValue; if ( sensorValue < 0 ) { errorMsg("sensor value should be positive"); exit(1); } else if ( sensorValue > 50 ) { warningMsg("sensor value greater than 50 (applying threshold)..."); sensorValue = 50; } return sensorValue; }
Разрешимость: неразрешимый |
[1] Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.