Articles of abogado de lenguaje

¿Es el comportamiento indefinido de sizeof (* ptr) cuando se apunta a memoria no válida?

Todos sabemos que desreferenciar un puntero nulo o un puntero a la memoria no asignada invoca un comportamiento indefinido. Pero, ¿cuál es la regla cuando se usa dentro de una expresión pasada a sizeof ? Por ejemplo: int *ptr = 0; int size = sizeof(*ptr); ¿Esto tampoco está definido?

¿Es argv escribible?

C11 5.1.2.2.1 / 2 dice: Los parámetros argc y argv y las cadenas apuntadas por la matriz argv serán modificables por el progtwig y conservarán sus últimos valores almacenados entre el inicio del progtwig y la terminación del progtwig. Mi interpretación de esto es que especifica: int main(int argc, char **argv) { if ( argv[0][0] […]

¿Está fgets () devolviendo NULL con un corto buffer compatible?

En la prueba unitaria una función que contiene fgets() , encontró un resultado inesperado cuando el tamaño del búfer n < 2 . Obviamente, ese tamaño de búfer es tonto, pero la prueba es explorar casos de esquina. Código simplificado: #include #include void test_fgets(char * restrict s, int n) { FILE *stream = stdin; s[0] […]

¿Está agregando un puntero “char *” UB, cuando en realidad no apunta a una matriz de caracteres?

C ++ 17 ( expr.add / 4 ) dice: Cuando una expresión que tiene un tipo integral se agrega o se resta de un puntero, el resultado tiene el tipo del operando del puntero. Si la expresión P apunta al elemento x [i] de un objeto de matriz x con n elementos, las expresiones P […]

Elenco eficiente sin signo a firma evitando el comportamiento definido por la implementación

Quiero definir una función que toma un unsigned int como argumento y devuelve un módulo int congruente UINT_MAX + 1 al argumento. Un primer bash podría verse así: int unsigned_to_signed(unsigned n) { return static_cast(n); } Pero, como sabe cualquier abogado de idiomas, la conversión desde sin signo a los valores firmados por más de INT_MAX […]

¿Qué dice la norma acerca de cómo llamar claramente a un vector cambia la capacidad?

Este sitio web implica que borrar un vector PUEDE cambiar la capacidad: http://en.cppreference.com/w/cpp/container/vector/clear Muchas implementaciones no liberarán la memoria asignada después de una llamada a clear (), dejando efectivamente la capacidad () del vector sin cambios. Pero de acuerdo con @JamesKanze, esto es incorrecto y el estándar exige que eso no cambie la capacidad. ¿Qué […]

¿Hay implementaciones complementarias de C en dos?

Como todos sin duda sabemos , el estándar ISO C (y C ++ también, creo, aunque estoy más interesado en el lado C) permite tres representaciones subyacentes de números con signo: complemento de dos; el complemento de unos; y signo / magnitud La entrada de Wikipedia indica que el signo / magnitud se usa en […]