Clang ++ 6.0 Memory Sanitizer не сообщает о неинициализированной локальной переменной в функции, возвращаемое значение которой определяет условную ветвь - PullRequest
0 голосов
/ 25 июня 2018

Следующий код (в src.cpp) использовался для экспериментов с Clang's Memory Sanitizer (MSan)

#include <iostream>
#include <vector>

int add(int x, int y) {
    int sum;
    sum = x + y;
    return sum;
}
int main() {
    if(add(10, 20) > 0) {
        std::cout << "Greater";
    }
    std::cout << std::endl;
    return 0;
}

Мы ясно видим, что sum унифицирован и может привести к неопределенному поведению. Согласно MSan Github Wiki

MemorySanitizer является точным битом: он может отслеживать неинициализированные биты в битовый. Это будет терпеть копирование неинициализированной памяти, а также простые логические и арифметические операции с ним. В общем, MemorySanitizer молча отслеживает распространение неинициализированных данных в памяти и выдает предупреждение, когда берется ветвь кода (или нет принято) в зависимости от неинициализированного значения.

Очевидно, что это соответствует этому варианту использования, поскольку ветвь if будет взята на основе начального значения sum. Однако при запуске этого кода, скомпилированного с

, не отображается сообщение об ошибке / предупреждение.

clang++ -fsanitize=memory -fsanitize-memory-track-origins -O0 -std=c++14 src.cpp -o src

Clang 6.0 используется в Linux x86_64.

1 Ответ

0 голосов
/ 25 июня 2018

sum не является неинициализированным, потому что следующая инструкция - это присвоение переменной sum. Этот код такой же как:

int sum = x + y;

И вот почему он инициализируется.

...