При создании решения Visual Studio с MSBuild мы заметили, что полученный вывод журнала каким-то образом путается:
6>foo.cpp(819): warning C4100: "param1": unreferenced formal parameterbar.cpp(388): warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. [C:\src\myproject.vcxproj]
C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(2254): note: see declaration of "sscanf"foo.cpp(819): warning C4100: "param2": unreferenced formal parameter
Для меня это выглядит примерно так, как если бы несколько потоков записывали в файл без надлежащей синхронизации. Обратите внимание, что номер порядка сборки (в данном случае 6) появляется только один раз. Строки вокруг этого отрывка выглядят нормально, но похожие ошибки появляются в журнале. Мы можем воспроизвести похожие проблемы с каждой сборкой. Эта проблема появляется как на stdout, так и в лог-файле.
msbuild вызывается со следующими параметрами:
/m /p:Configuration=Release /t:rebuild /nr:false /FileLogger /Verbosity:normal /ds solution.sln
Используемая версия 14.0.25420.1
Эта проблема вызывает проблемы при разборе журнала на статистику об ошибках и предупреждениях компилятора. Есть идеи, что может вызвать это?
EDIT
Действия по воспроизведению проблемы:
- Создание нового проекта Visual Studio (я выбрал консольное приложение) с отключенными проверками SDL (C4996 должно быть предупреждением, а не ошибкой)
- Изменить конфигурацию на Release и платформу на x86 (в x64 Предупреждение C4456 как-то не запускается?)
- Установите уровень предупреждения на 4 (/ W4)
- Включить многопроцессорную компиляцию (/ MP)
Добавить в проект новый файл со следующим содержанием:
#include <stdafx.h>
#include <cstdio>
#include <iostream>
void foo()
{
int a = 42;
{
int a = 0;
std::cout << a << std::endl;
}
}
void bar()
{
char buffer[50];
int a = 40;
int b = 2;
sprintf(buffer, "%d plus %d is %d", a, b, a + b);
std::cout << buffer << std::endl;
}
- Создайте большое количество копий этого файла и добавьте все их в проект. Похоже, что чем больше файлов вы добавляете, тем больше вероятность возникновения проблемы. Я успешно воспроизвел проблему со 100 файлами.
- Скомпилируйте проект. Он завершится ошибкой с большим количеством ошибок LNK2005 из-за определения нескольких символов, но здесь это не имеет значения.
- См. Количество предупреждений, изменяющихся между двумя перестроениями. Должно быть в три раза больше файлов, которые вы добавили, но часто меньше. Это вызвано проблемой, описанной выше.