usuario7119460
Al intentar imprimir el primer argumento de la línea de comando:
std::cout << argv[0] << std::endl;
clang-tidy da la advertencia:
advertencia: ‘no usar aritmética de punteros’ de [cppcoreguidelines-pro-bounds-pointer-arithmetic]
¿Hay alguna forma alternativa de usar los valores de argv
sin usar aritmética de punteros? ¿No está accediendo a un char**
por algún método sensato va a tener que usar la aritmética de punteros?
Agradezco que haya algunas funciones especializadas para manejar los argumentos de la línea de comandos, pero parecen demasiado pesadas para simplemente imprimir un argumento.
estoy escribiendo en c++
utilizando el clang
compilador y construcción con cmake
.
De clang-tidy – cppcoreguidelines-pro-bounds-pointer-arithmetic:
Los punteros solo deben referirse a objetos individuales, y la aritmética de punteros es frágil y fácil de equivocarse.
span<T>
es un tipo seguro con verificación de límites para acceder a matrices de datos.
Entonces sí:
¿Hay alguna forma alternativa de usar los valores de argv sin usar la aritmética de punteros? ¿El acceso a un char ** por algún método sensato no tendrá que usar la aritmética de punteros?
Tienes toda la razón. Sin embargo, la directriz se trata de ocultar esa aritmética de punteros, permitiendo que una clase auxiliar realice verificaciones de límites antes de realizar la aritmética. Puedes construir un span<char*>
de argv
y argc
. Por ejemplo, en C++20 escribirías:
auto args = std::span(argv, size_t(argc));
y luego usar args
en vez de argv
.
-
@SergeyA Parece que no está de acuerdo con la pauta. Lo cual es perfectamente justo, y en ese caso, no enciendas esa advertencia.
– usuario743382
16 de agosto de 2017 a las 17:02
-
Estoy de acuerdo con la mayoría de ellos, pero esta regla en particular me parece mal pensada. Una rama en cada acceso no es lo que quiero en mi código.
– SergeyA
16 de agosto de 2017 a las 17:08
-
No hay límites para comprobar
std::span
en C++20.– Mijaíl
12 de febrero de 2021 a las 10:48
-
“
constexpr reference operator[](size_type idx) const;
Devuelve una referencia a laidx
-ésimo elemento de la secuencia. El comportamiento es indefinido siidx
está fuera de rango”– Caleth
12 de febrero de 2021 a las 10:58
-
std::span
acepta el tamaño comosize_t
(tipo sin firmar), mientras queargc
es unint
(tipo firmado). Sin una conversión explícita, habría una advertencia sobre la conversión implícita firmada->sin firmar.– Mijaíl
23 de agosto de 2021 a las 10:18
si solo necesitas
argv[0]
puedes usar*argv
. Pero más allá de eso, nop.– Benjamín Lindley
16 de agosto de 2017 a las 16:14
@spectras nunca una matriz. Los argumentos de función no pueden ser matrices.
– erorika
16 de agosto de 2017 a las 16:40
Es solo que las pautas básicas de implementación se volvieron locas. Una mejor implementación debería reconocer el caso especial de
main
y deja de molestarte con la aritmética de punteros en este caso.– SergeyA
16 de agosto de 2017 a las 16:54
@hvd Que las pautas deberían hacer una excepción para
main
. Es una interfaz bien conocida que es no va a cambiar, así que ¿por qué molestar a los desarrolladores con esta advertencia?– SergeyA
16 de agosto de 2017 a las 17:03
@SergeyA Como señalo en mi respuesta, es posible leer los argumentos de la línea de comandos sin cambiar la interfaz de una manera compatible con esta guía. Pero creo que sería bueno que al menos lo abordaran. Ya sea haciendo una excepción o mostrando cómo implementarlo sin violar la guía, no me importa demasiado.
– usuario743382
16 de agosto de 2017 a las 17:07