我收到了cran对yaImpute包中ANN.cpp的clang编译发出的"严重警告",表明;

格式字符串不是字符串文字(可能不安全) [-WFormat-安全]

我已经追踪到这个C++代码块的警告,特别是对Rprintf(msg)的两个调用.然而,在阅读关于这场战争的帖子时,我不清楚到底如何解决印刷中的安全问题.

void annError(const char *msg, ANNerr level)
{
    if (level == ANNabort) {
      //cerr << "ANN: ERROR------->" << msg << "<-------------ERROR\n";
      Rprintf("ANN Fatal ERROR:");
      Rprintf(msg);
//    std::exit(1);
    }
    else {
      //cerr << "ANN: WARNING----->" << msg << "<-------------WARNING\n";
      Rprintf("ANN WARNING:");
      Rprintf(msg);
    }
}

我看到的建议是,使用__attribute__((__format__ (__printf__, 2, 0)))是解决此问题的一种方法,但不确定如何修改代码块.诚然,我不是一名C++程序员,我在yaImpute包中继承了这段代码.如有任何建议,我们将不胜感激.

推荐答案

格式字符串引用Rprintf的第一个参数,它应该是string literal:

Rprintf("ANN WARNING:");
Rprintf("%s", msg);

或者:

Rprintf("ANN WARNING:\n%s", msg);

另请参阅the GCC manual-Wformat-security编译器标志的文档.(是的,你的警告是由Clang发出的,但the Clang manual在这里帮助要小得多.)

R相关问答推荐

如何从使用lapply()的r中的拆分数据帧中删除多个部分?

R根据名称的载体对收件箱列采取行动

如何设置搜索栏来搜索整个Shiny应用程序页面?

使用列表列作为case_when LHS的输入

有没有一种方法可以在子包上使用‘library()’中的‘exclub’参数?

高质量地将R格式的图表从Word中输出

跨列应用多个摘要函数:summerise_all:列表对象无法强制为double类型'

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

如何在RMarkdown LaTex PDF输出中包含英语和阿拉伯语?

用相同方法得到不同函数的ROC最优截断值

使用ggsankey调整Sankey图中单个 node 上的标签

是否可以创建一个ggplot与整洁判断的交互作用

删除具有相同标题的tabPanel(shinly)

如何在ggplot图中找到第二轴的比例

找出二叉树中每个 node 在R中的深度?

过滤名称以特定字符串开头的文件

如何在使用箭头R包(箭头::OPEN_DATASSET)和dplyr谓词时编写具有整齐计算的函数?

自动STAT_SUMMARY统计与手动标准误差之间的差异

如何根据未知数的多列排除重复行

如何使用grepl()在数据帧列表中 Select 特定字符串?