Поделиться через


Ошибка: strncat-param-overlap

Ошибка санитизатора адреса: strncat-param-overlap

Код, перемещающий память в перекрывающемся буфере, может вызвать ошибки, которые трудно диагностировать.

Пример

В этом примере показано, как AddressSanitizer может перехватывать ошибки, вызванные перекрывающимися параметрами функций CRT.

(На основе llvm-project/компилятор-rt/test/asan/TestCases/strncat-overlap.cpp.)

// example1.cpp
// strncat-param-overlap error
#include <string.h>

void bad_function() {
    char buffer[] = "hello\0XXX";
    strncat(buffer, buffer + 1, 3); // BOOM
    return;
}

int main(int argc, char **argv) {
    bad_function();
    return 0;
}

Чтобы создать и проверить этот пример, выполните следующие команды в командной строке разработчика Visual Studio 2019 версии 16.9 или более поздней:

cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe

Результирующая ошибка

Screenshot of debugger displaying strncat-param-overlap error in example 1.

См. также

Обзор AddressSanitizer
Известные проблемы AddressSanitizer
Справочник по сборке и языку AddressSanitizer
Справочник по среде выполнения AddressSanitizer
Теневой байт AddressSanitizer
Облачное или распределенное тестирование AddressSanitizer
Интеграция отладчика AddressSanitizer
Примеры ошибок AddressSanitizer