msbuild日志输出坏了

时间:2018-04-27 15:31:01

标签: visual-studio logging msbuild

使用MSBuild构建Visual Studio解决方案时,我们注意到生成的日志输出在某种程度上混淆了:

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

在解析有关编译器错误和警告的统计信息的日志时,此问题会导致问题。什么可能导致它的想法?

修改

重现问题的步骤:

  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. 查看两次重建之间警告的数量变化。应该是您添加的文件数量的三倍,但通常更少。这是由上述问题引起的。

0 个答案:

没有答案