Неверный вывод журнала msbuild - PullRequest
0 голосов
/ 27 апреля 2018

При создании решения 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

Действия по воспроизведению проблемы:

  1. Создание нового проекта Visual Studio (я выбрал консольное приложение) с отключенными проверками SDL (C4996 должно быть предупреждением, а не ошибкой)
  2. Изменить конфигурацию на Release и платформу на x86 (в x64 Предупреждение C4456 как-то не запускается?)
  3. Установите уровень предупреждения на 4 (/ W4)
  4. Включить многопроцессорную компиляцию (/ MP)
  5. Добавить в проект новый файл со следующим содержанием:

    #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;
    }
    
  6. Создайте большое количество копий этого файла и добавьте все их в проект. Похоже, что чем больше файлов вы добавляете, тем больше вероятность возникновения проблемы. Я успешно воспроизвел проблему со 100 файлами.
  7. Скомпилируйте проект. Он завершится ошибкой с большим количеством ошибок LNK2005 из-за определения нескольких символов, но здесь это не имеет значения.
  8. См. Количество предупреждений, изменяющихся между двумя перестроениями. Должно быть в три раза больше файлов, которые вы добавили, но часто меньше. Это вызвано проблемой, описанной выше.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...