天道酬勤,学无止境

TravisCI / Coverity:警告 - 未发出任何文件(TravisCI / Coverity: Warning - No files were emitted)

问题

我有一个中等大小的 github 存储库,我为其配置了 Travis-CI/Coverity 工具。 大约一个月前,我的设置运行良好:Travis 编译并构建了我的应用程序,然后执行 Coverity 扫描,我可以在我的 Coverity 页面上看到结果。

但是,最近,Coverity 分析停止工作。 我查看了 Travis 日志文件,并在构建成功时与旧日志进行了比较,这就是我发现的:

在日志的末尾,失败的版本包含下一个警告:

[警告] 未发出任何文件。 这可能是由于您的配置存在问题,或者因为您的构建命令实际上没有编译任何文件。

请确保您已经配置了编译中实际使用的编译器。

更多详情请查看:/home/travis/build/name/repo-name/build/cov-int/build-log.txt

正在提取 0 个文件的 SCM 数据...

...

因此, Travis 构建正在通过,但没有为 Coverity 生成任何内容。 我检查了我的 Travis 配置文件,它与 Coverity 构建成功时的提交相同。

为了实验,我克隆了我的项目存储库,在构建成功时回滚到版本并为它们设置 Travis/Coverity。 你猜怎么着? 同样的警告! 因此,过去(大约 35 天前)有效的相同设置不再有效。 因此,我得出结论,由于 Travis 没有生成某些文件,因此它发生了一些变化。

我想知道是否有人遇到过这个问题? 它可能是什么? 我需要更改一些 Travis 设置吗?

一些附加信息:我使用 CMake 来构建我的项目,它有两个依赖项:Qt 和 OpenSceneGraph(我必须为 Travis 安装)。

这是我的近似脚本.travis.ymlcoverity_scan分支:

language: cpp
os: linux
compiler: gcc
sudo: required
dist: trusty

addons:
  apt:
    packages:
      - cmake
      - g++-4.8
  coverity_scan:
    project:
      name: "name/project"
      description: "Build submitted via Travis CI"
    notification_email: email@domain.com
    build_command:   "make -j2 VERBOSE=1"
    branch_pattern: coverity_scan

env:
  global:
    - PROJECT_SOURCE=${TRAVIS_BUILD_DIR}/src/
    - PROJECT_BUILD=${TRAVIS_BUILD_DIR}/build/
    # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
    #   via the "travis encrypt" command using the project repo's public key
   - secure: "...secure..."

before_install:
  # download Qt
  # ...
  # download OpenSceneGraph
  # ...
  # imitate x server
  - export DISPLAY=:99.0
  - /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16
  - sleep 3

install:
  # install Qt
  - sudo apt-get --yes install qt55base qt55imageformats qt55svg 
  # compiler
  - export CXX="g++-4.8"
  - export CC="gcc-4.8"
  # install OpenSceneGraph
  # ...

before_script:
  # Qt location
  # ...
  # OpenSceneGraph variables
  # ...

  # create build folder
  - mkdir $PROJECT_BUILD
  - cd $PROJECT_BUILD 
  # cmake command
  - cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/opt/qt54/lib/cmake -DProject_BUILD_TEST=ON -DProject_VERSION=0.0.0 $PROJECT_SOURCE

script:
  - if [[ "${COVERITY_SCAN_BRANCH}" == 1 ]];
    then
      echo "Don't build on coverty_scan branch.";
      exit 0;
    fi
  # compile everything, if not coverity branch
  - make -j2
  # run unit tests
  # ...
回答1

经过一些研究并查看现有示例后,我终于使它起作用了。 为了修复警告,并因此确保为分析发出文件,有必要明确指定编译器二进制文件(根据注释更新)。 在我.travis.yml我不得不添加一个build_command_prepend的前build_command中的coverity_scan附加。 该块的最终外观示例如下:

# ... 
coverity_scan:
    project:
      name: "name/project"
      description: "Build submitted via Travis CI"
    notification_email: name@domain.com

# ! have to specify the binary (updated, thanks to Caleb)
    build_command_prepend: "cov-configure --comptype gcc --compiler gcc-4.8 --template"

    build_command:   "make VERBOSE=1"
    branch_pattern: coverity_scan

# ...

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • TravisCI / Coverity: Warning - No files were emitted
    I have a medium size github repository for which I configured Travis-CI/Coverity tools. About a month ago my setup had worked just fine: Travis compiled and built my application, and then performed the Coverity scan and I could see the results on my Coverity page. However, lately, the Coverity analysis stopped working. I looked through the Travis log files and compared to the old logs when the builds were successful and that's what I found: At the end of the log, the failed version contains the next warning: [WARNING] No files were emitted. This may be due to a problem with your configuration
  • Can't get Coverity Scan to work (Java/Kotlin/Gradle 3.3 on Windows and Travis)
    UPDATE: See the solution in Caleb's answer I am trying really hard to make Coverity work for my build, but so far with little success. First the details: My project is run of the mill java library (no web or fancy containers), very few compile-only dependencies, built using Gradle The production code is written in Java and Kotlin The complete project is available on github: https://github.com/ddimtirov/nuggets And on Coverity Scan: https://scan.coverity.com/projects/ddimtirov-nuggets?tab=project_settings My development environment is Windows 10, Java 1.8.0_92, Gradle 3.3, CMD shell (though I
  • Coverity 和 C++:堆(带有新的)与栈上分配(Coverity and C++: heap (with new) vs. on-stack allocation)
    问题 我正在使用coverity (5.5.1)(以及其他)来强化我的代码。 我偶然发现了一个问题,现在我怀疑我的覆盖设置不完整。 看看这个例子: class A { int _a,_b; public: A(int b) : _a(_b), _b(b) { } }; int main(void) { A *a1 = new A(5); delete a1; A a2(5); return 0; } 可以看出,在使用b初始化之前,我使用_b来初始化_a 。 在这个问题中,我了解到编译器或任何其他工具发出这样的警告“很高兴”。 与我现在发现的问题的最初理解相反,coverity 实际上会发出一个完美匹配的缺陷( UNINT ),但仅当在堆栈上分配时,而不是在使用new创建时。 所以在我的main函数中,我收到了A a2(5)的警告,但没有收到A *a1 = new A(5)的警告。 在我看来,coverity 正在处理对构造函数的调用,使用new时与在堆栈上创建对象时不同。 我的 Coverity 配置中是否有什么我忽略的地方? 在堆上分配时,我该怎么做才能收到警告? 回答1 事实证明,根据支持,这是 Coverity 中的一个已知错误(即使在当前版本中)。 次年夏天发布的版本可能会修复。 该错误列在 ID 下: 50128 UNINIT FN:在初始化之前在构造函数中使用的成员
  • C++ init-list:使用未初始化的成员初始化其他成员不会发出警告(C++ init-list: using non-initialized members to initialize others gives no warning)
    问题 g++ (4.4 和 4.6) 和 clang++ (3.2) 和coverity 都没有,使用-Wall 和-Wextra(+ 其他一些)或-Weverything 分别给我以下代码片段的警告: class B { char *t2; char *t; public: B() : t2(t), t(new char[100]) {} }; 我至少希望有一个关于未初始化(成员)变量使用的小警告。 有什么我想念的吗? 这是一个通缉的“无警告”场景吗? 我的软件中至少有(现在有)一个很难找到的错误。 编辑:正如在这个新问题中所读到的,我意识到在某些情况下, coverity 会警告这个问题。 回答1 没有充分的理由不在这里发出警告。 G++ 不够聪明,无法诊断构造函数中未初始化的成员,请参阅 http://gcc.gnu.org/PR2972 我有一个正在进行中的补丁来修复它,我希望在“今年的某个时候”完成 即使使用我的补丁,我也不确定 G++ 是否会发出警告,因为t2已初始化,但它已初始化为不确定值。 对于编译器来说,跟踪这不是微不足道的,但应该是可能的(所以我很惊讶甚至 Coverity 也错过了它。)不过,诸如valgrind类的运行时工具可以做到这一点。 当我重新访问我的补丁时,我会考虑这种情况,看看是否可以在不增加太多开销的情况下发出警告
  • 如果忽略返回值,如何发出警告?(How to raise warning if return value is disregarded?)
    问题 我想查看我的代码(C ++)中所有忽略函数返回值的地方。 我该如何做-使用gcc或静态代码分析工具? 错误的代码示例: int f(int z) { return z + (z*2) + z/3 + z*z + 23; } int main() { int i = 7; f(i); ///// <<----- here I disregard the return value return 1; } 请注意: 即使该功能及其使用位于不同文件中,它也应能正常工作免费的静态检查工具 回答1 您需要GCC的warn_unused_result属性: #define WARN_UNUSED __attribute__((warn_unused_result)) int WARN_UNUSED f(int z) { return z + (z*2) + z/3 + z*z + 23; } int main() { int i = 7; f(i); ///// <<----- here i disregard the return value return 1; } 尝试编译此代码会产生: $ gcc test.c test.c: In function `main': test.c:16: warning: ignoring return value of `f', declared
  • 为每个Travis拉取请求构建运行Coverity扫描(Run Coverity scan for every Travis pull request build)
    问题 我想尽可能地使学生作业评分系统自动化。 理想情况下,提交作业时将采取这些步骤。 学生分叉我的Github存储库并修改文件学生将本地代码推送到其存储库并创建请求请求 Travis CI检测到拉取请求并运行拉取请求构建如果代码构建成功, Coverity将对提取请求运行静态代码分析学生从Github拉取请求页面获取构建状态 我已经为我的回购中的每个拉取请求成功设置了Travis构建。 我已经通过Travis成功为仓库中的每个提交运行了Coverity扫描。 但是我无法触发Coverity扫描来获取拉取请求,仅运行Travis构建。 我可以解决此问题并为每个拉取请求维护Coverity扫描报告吗? 这是我的.travis.yml language: c compiler: gcc env: global: # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created # via the "travis encrypt" command using the project repo's public key - secure: "WHkT1bLbpz8VA8tl
  • 创建 VuePress + GithubPages + TravisCI 在线文档
    文章目录 最终效果思路总体过程用到的东西相关 创建Github仓库创建Github仓库SSH密钥链接Github生成SSH密钥Github添加SSH密钥测试SSH密钥 配置VuePress安装VuePress安装yarnDebian / UbuntuWindows更换国内的源 安装VuePressVuePress目录结构 配置依赖和脚本配置package.json 页面的设置首页文档属性markdown扩展默认主题设置导航栏侧边栏Git仓库其他 插件config.js所有内容 TravisCI生成和发布创建gh-pages分支deploy.sh部署文件Travis CI 部署文件生成和使用 Token生成Token Travis CI 绑定和配置绑定 Github 账号添加 Token 推送到Github完成 最新博客链接 VuePress 在线文档链接_Github Pages VuePress 在线文档链接_博客服务器(如果上面进不去,可以进这个,服务器在阿里云) Github链接 最终效果 最终效果链接 思路 总体 VuePress 在本地完成项目的源文件,推送至 Github 触发 Travis CI 自动构建目标文件,完成后自动部署到另一个 Github 分支,此分支作在线文档使用。 在Github上创建两个分支master和gh-pages
  • 如何发现未定义的行为(How to spot undefined behavior)
    问题 有没有办法知道你的程序在 C++(甚至 C)中是否有未定义的行为,而不是记住整个规范? 我问的原因是我注意到很多程序在调试中工作但没有发布的情况是由于未定义的行为。 如果有至少可以帮助发现UB的工具,那就太好了,所以我们知道有潜在的问题。 回答1 良好的编码标准。 保护你免受你自己的伤害。 这里有一些想法: 代码必须在最高警告级别编译...没有警告。 (换句话说,当设置为最高级别时,您的代码不得引发任何警告。)为所有项目打开警告标志的错误。 这确实意味着当您使用其他人的库时需要做一些额外的工作,因为他们可能没有这样做。 您还会发现有些警告是毫无意义的……根据您的团队的决定单独关闭这些警告。 始终使用 RAII。 永远不要使用 C 风格的强制转换! 绝不! - 我认为有一些罕见的情况,你必须打破它,但你可能永远找不到它们。 如果必须reinterpret_cast或强制转换为void使用包装器以确保始终强制转换为相同类型/从相同类型强制转换。 换句话说,将您的指针/对象包装在boost::any并将指向它的指针转换为您需要的任何内容,然后在另一侧做同样的事情。 为什么? 因为您将始终知道从什么类型开始reinterpret_cast并且boost::any将强制您在此之后强制转换为正确的类型。 这是你能得到的最安全的。 始终在声明点(或在类中的构造函数初始值设定项中)初始化变量
  • 查找未初始化的成员变量的简便方法(Easy way find uninitialized member variables)
    问题 我正在寻找一种找到未初始化的类成员变量的简便方法。 在运行时或编译时找到它们是可以的。 目前,我在类构造函数中有一个断点,并逐一检查成员变量。 回答1 如果使用GCC,则可以使用-Weffc++标志,当成员初始化列表中未初始化变量时,该标志将生成警告。 这个: class Foo { int v; Foo() {} }; 导致: $ g++ -c -Weffc++ foo.cpp -o foo.o foo.cpp: In constructor ‘Foo::Foo()’: foo.cpp:4: warning: ‘Foo::v’ should be initialized in the member initialization list 缺点是-Weffc++还会在变量具有适当的默认构造函数时发出警告,因此不需要初始化。 当您在构造函数中而不是在成员初始化列表中初始化变量时,它也会警告您。 而且它还会警告许多其他C ++样式问题,例如缺少复制构造函数,因此当您要定期使用-Weffc++时,可能需要稍微清理一下代码。 还有一个错误会导致在使用匿名联合时始终向您发出警告,您目前无法解决其他问题,然后关闭警告,可以使用以下方法: #pragma GCC diagnostic ignored "-Weffc++" 总体而言,我发现-Weffc++在捕获许多常见的C +
  • TravisCI:在特定分支上运行 after_success(TravisCI: Run after_success on a specific branch)
    问题 我想知道如何仅为特定分支运行after_success脚本。 我正在使用自定义脚本在构建通过后部署应用程序。 我只想在prod分支上运行它。 到目前为止,我已经尝试了以下方法: #1 after_success: - # some deployment script on: prod #2 branches: only: - prod after_success: - # some deployment script #3 after_success: branches: only: - prod - # some deployment script 有什么建议么? 回答1 我通过使用TRAVIS_BRANCH环境变量编写一个简单的脚本并在after_success执行脚本来解决它 .travis.yml after_success: - ./deploy.sh 部署文件 #!/bin/bash if [ "$TRAVIS_BRANCH" == "prod" ]; then // do the deploy fi 回答2 您还可以通过在构建的部署阶段使用脚本提供程序来执行此操作。 这种方法更after_success ,但只允许一个命令,与after_success不同。 deploy: provider: script script: # some deployment
  • 如何自动更新 Docker Hub 上的完整描述?(How can I update full description on Docker Hub automatically?)
    问题 我正在使用 Travis CI 从 Dockerfiles 构建 docker 镜像,然后在成功时将它们推送到 Docker Hub。 我创建了一个描述图像及其使用方法的 MD 文件。 我想在完整描述部分对 Docker Hub 有相同的描述。 由于我将来可能会更新描述,因此我希望 Travis CI 使用新图像根据存储库中的 MD 文件自动更新描述。 任何人都知道如何做到这一点? 回答1 由于 Docker Hub 不公开任何 API,远程向 Docker Hub 发送内容的唯一方法是使用docker push命令,这限制了发送图像的使用。 另一方面,如果您让 Docker Hub 服务从 Github 或 Bitbucket 存储库为您构建映像,则 Docker Hub 将通过获取在该存储库中找到的README.md文件的内容来更新详细描述。 请参阅 Docker Hub 的自动构建文档中的了解构建过程部分。 这意味着您将Dockerfile和README.md文件托管在 Github 或 Bitbucket 上。 如果你真的需要首先在 TravisCI 上构建你的镜像(可能是因为你也在构建的镜像上运行自动化测试),那么你可以让 TravisCI 在 Docker Hub 上触发一个 webhook 来告诉 Docker Hub 在 TravisCI
  • 如何在本地运行travis-ci(How to run travis-ci locally)
    问题 我刚刚加入一个项目,对travis-ci还是陌生的。 我宁可不必将.travis.yml每一个小改动和我对源代码所做的每一个小改动都推送到运行构建中。 使用jenkins,您可以下载jenkins并在本地运行。 特拉维斯会提供这样的服务吗? 注意:我已经看过travis-ci cli并下载了它,但是似乎要做的就是调用他们的API,然后将其连接到我的GitHub存储库,因此,如果我不进行推送,那么重新启动就没关系最后一个版本。 回答1 此过程使您可以在计算机上完全复制任何Travis构建作业。 另外,您可以随时中断该过程并进行调试。 以下是我在php-school / cli-menu上完美再现作业#191.1的结果的示例。 先决条件 您在GitHub上有公共仓库您在Travis上至少运行了一个版本您已经在计算机上设置了Docker 设置构建环境 参考:https://docs.travis-ci.com/user/common-build-problems/ 组成您自己的临时内部版本ID BUILDID="build-$RANDOM" 查看构建日志,打开显示更多信息以获取WORKER INFORMATION的信息并找到INSTANCE行,将其粘贴到此处并运行(将冒号后的标记替换为最新的可用标记): INSTANCE="travisci/ci-garnet:packer
  • 如果在参数列表中使用了另一个类型定义的名称,则发出警告(Warn if another typedef'd name of a type is used in an argument list)
    问题 考虑一个大型项目,其中许多类型都是typedef 'd,例如 typedef int age; typedef int height; 以及一些获取这些类型参数的函数: void printPerson(age a, height h) { printf("Age %d, Height %d\n", a, h); } 如果这些参数的类型错误,是否有办法在编译时发出警告,例如 age a = 30; height h = 180; printPerson(h, a); /* No warning, because a and h are both integers */ 在这种情况下,gcc(或一些静态代码分析工具)是否有警告选项? 回答1 GCC 中没有对此的内置支持。 基于 Sparse nocast属性,有一个功能请求来添加它。 然而,这并没有被实施。 但是,如果您可以使用 Sparse,则可以通过使用__attribute__((nocast))标记每个 typedef 来实现。 在 C++ 中,您可以通过创建包装类而不是 typedef 来实现这一点,然后简单地不为它们定义隐式转换。 回答2 Klocwork 有一些与他们所谓的“强类型”相关的检查。 对于您的代码,它会抛出 STRONG.TYPE.ASSIGN.ARG,因为参数类型不匹配。 它还抱怨将int值(常量
  • 如何从coverity-scan中删除项目(how to remove a project from coverity-scan)
    问题 我过去用coverity-scan注册了一个项目。 我现在想从coverity-scan(或至少从我的仪表板中删除该项目;但我最好完全删除该项目)。 我被卡住了,因为网络界面中似乎没有这样的选项。 我错过了什么吗? 回答1 你不能。 我刚刚要求 Coverity 的支持删除一个并得到答复: 我们通常不会从 SCAN 中删除项目,因为我们会保留项目的汇总指标。 回答2 在“项目设置”页面的最底部有一个“删除您的项目”按钮。 回答3 删除您的项目按钮仅对项目管理员可用,并且仅当构建尚未提交进行分析时才可用。
  • Run Coverity scan for every Travis pull request build
    I want to automate student assignment grading system as much as possible. Ideally these steps will be taken when submitting the assignment. Student forks my Github repository and modifies files Student pushes the local code to his repository and creates pull request Travis CI detects pull request and run Pull Request build If code builds successfully, Coverity runs static code analysis for the pull request Student gets build status from the Github pull request page I've successfully set Travis builds for every pull request in my repo. I have successfully run Coverity scan via Travis for every
  • TravisCI:如何允许环境变量失败(TravisCI: How to allow failures for environment variable)
    问题 如何允许具有特定环境变量值的构建失败? 例如: .travis.yml: env: - TEST_GROUP=Smoke - TEST_GROUP=other # How to allow failures for this variable? matrix: allow_failures: - TEST_GROUP=other # This does not work 回答1 您需要在allow_failures部分中明确引用env : matrix: allow_failures: - env: TEST_GROUP=other 回答2 @roidrage 的答案对我有用。 在单个矩阵维度中使用多个环境变量时,环境变量必须像这样组合: env: - TEST_GROUP=Smoke TEST_ENV=airport - TEST_GROUP=other TEST_ENV=outside matrix: allow_failures: - env: TEST_GROUP=other TEST_ENV=outside
  • Coverity and C++: heap (with new) vs. on-stack allocation
    I'm using coverity (5.5.1) (among others) to harden my code. I stumbled over a problem and now I have doubts that my setup of coverity is not complete. Have a look at this example: class A { int _a,_b; public: A(int b) : _a(_b), _b(b) { } }; int main(void) { A *a1 = new A(5); delete a1; A a2(5); return 0; } As can be seen I'm using _b to initialize _a before it is initialized with b. In this question I learned that it would be "nice to have" such a warning issued by the compiler or any other tool. Contrarily to my original understanding of the problem I now found out, that coverity actually
  • 为什么 git 标签没有出现在任何分支上?(Why doesn’t a git tag show up on any branch?)
    问题 我克隆了带有 v1.4.9 标签的 mosquitto 存储库。 但是标记的提交似乎不在分支上。 怎么会这样? 作者是否真的在自己的 repo 上保留了一个分支,但只将标签从该分支推送到 GitHub? 或者他只是对标签做出承诺? 我把标签做成了本地分支 $ git checkout -b work149 v1.4.9 并查看了分支上的最后一次提交: $ git log -1 commit 91bfd82491f90e24b6fe9c036f0b04a1f5c14a89 Merge: bf959ef 2d0af73 Author: Roger A. Light <roger@atchoo.org> Date: Thu Jun 2 22:05:34 2016 +0100 Merge branch 'fixes' 此提交是在fixes分支之前的提交。 使用git log --graph我可以看到同一分支上的较早提交(不是fixes分支,而是我试图理解的分支): * | commit bf959ef9b0ae0e4d74bf80158ffb0b7c69da533d |\ \ Merge: 646e0a0 5cca6b4 | |/ Author: Roger A. Light <roger@atchoo.org> | | Date: Sun Feb 14 14:38:42 2016
  • Coverity Scan fails to build <stdlib.h> with _GNU_SOURCE defined
    The Coverity Scan Build Tool fails to compile any C file that includes <stdlib.h> on Ubuntu 18.04 when _GNU_SOURCE is defined: $ cat > main.c #include <stdlib.h> int main() { } $ $ gcc -D_GNU_SOURCE=1 -o main main.c $ $ /opt/cov-analysis/bin/cov-build --dir cov-int gcc -D_GNU_SOURCE=1 -o main main.c Coverity Build Capture (64-bit) version 2017.07 on Linux 4.15.0-20-generic x86_64 ... [WARNING] Emitted 0 C/C++ compilation units (0%) successfully ... $ The same build works perfectly on Ubuntu 16.04 or without _GNU_SOURCE defined: $ /volatile/local/cov-analysis/bin/cov-build --dir cov-int gcc -o
  • how to remove a project from coverity-scan
    I've registered a project with coverity-scan in the past. I would now like to remove that project from coverity-scan (or at least from my dashboard; but preferrably i'd like to remove the project entirely). I'm stuck as there seems to be no such option in the web-interface. am i missing something?