使用char**argv时如何避免指针运算

use*_*460 12 c++ pointer-arithmetic command-line-arguments clang-static-analyzer clang++

尝试打印第一个命令行参数时:

std::cout << argv[0] << std::endl;
Run Code Online (Sandbox Code Playgroud)

clang-tidy发出警告:

警告:[cppcoreguidelines-pro-bounds-pointer-arithmetic]中的'不使用指针运算'

argv没有使用指针算法的替代方法来使用值?是不是char**通过任何明智的方法访问必须使用指针算术?

我欣赏有一些专门的函数来处理命令行参数,但它们似乎太重了,不能简单地打印一个参数.

我正在编写c++,使用clang编译器和构建cmake.

小智 9

来自clang-tidy - cppcoreguidelines-pro-bounds-pointer-arithmetic:

指针应仅引用单个对象,指针算法易碎且容易出错.span<T>是一种用于访问数据数组的边界检查的安全类型.

是的:是的

是否有另一种方法可以在不使用指针算法的情况下使用argv的值?是不是通过任何合理的方法访问char**必须使用指针算术?

你是完全正确的.但是,指南是关于隐藏指针算法,让助手类在执行算术之前进行边界检查.你可以构建一个span<char*>from argvargc.

  • @SergeyA 听起来您从根本上不同意该指南。这是完全公平的,在这种情况下,不要打开那个警告。 (3认同)
  • 我同意他们中的大多数人,但我发现这个特殊的规则很难想到.每次访问的分支都不是我在代码中想要的. (3认同)
  • `std::span` 接受大小作为 `size_t` (无符号类型),而 `argc` 接受 `int` (有符号类型)。如果没有显式转换,则会出现有关隐式有符号-&gt;无符号转换的警告。 (3认同)
  • C++20 中没有对“std::span”进行边界检查。 (2认同)
  • “`constexpr引用运算符[](size_type idx) const;`返回对序列中第`idx`个元素的引用。如果`idx`超出范围,则行为未定义” (2认同)
  • @Mikhail 和 c 风格的演员阵容也应该有一个警告 (2认同)