Articles of undefined behavior

¿Por qué char * causa un comportamiento indefinido mientras que char no?

Intentar modificar un literal de cadena provoca un comportamiento indefinido: char * p = “wikipedia”; p[0] = ‘W’; // undefined behaviour Una forma de evitar esto es definirlo como una matriz en lugar de un puntero: char p[] = “wikipedia”; p[0] = ‘W’; // ok ¿Por qué char* causa un comportamiento indefinido, mientras que char[] […]

Matriz de acceso más allá del límite en C y C ++

int data[8]; data[9] = 1; ¿Qué dice el estándar de C ++ al respecto? ¿Es este comportamiento indefinido? Al menos el comstackdor C (gcc -std = c99 -pedantic -W -Wall) no dice nada al respecto. Gracias.

¿Por qué es un comportamiento indefinido eliminar una matriz de objetos derivados a través de un puntero base?

Encontré el siguiente fragmento en el estándar C ++ 03 en 5.3.5 [expr.delete] p3 : En la primera alternativa ( eliminar objeto ), si el tipo estático del objeto a eliminar es diferente de su tipo dynamic, el tipo estático será una clase base del tipo dynamic del operando y el tipo estático tendrá un […]

¿Es correcto cambiar el comportamiento indefinido si el recuento es más grande que el ancho del tipo?

Acabo de comprobar el estándar de C ++ . Parece que el siguiente código NO debe ser un comportamiento indefinido : unsigned int val = 0x0FFFFFFF; unsigned int res = val >> 34; // res should be 0 by C++ standard, // but GCC gives warning and res is 67108863 Y del estándar: El valor […]

Usando la variable recién declarada en la inicialización (int x = x + 1)?

Me topé con un comportamiento que me sorprendió: Cuando se escribe: int x = x+1; en un C / C ++ – progtwig (o incluso una expresión más compleja que involucra la nueva variable creada x) mi gcc / g ++ comstack sin errores. En el caso anterior, X es 1 después. Tenga en cuenta […]

Son mutaciones múltiples de la misma variable dentro del inicializador que enumeran el comportamiento indefinido antes de C ++ 11

Considera el siguiente código: int main() { int count = 0 ; int arrInt[2] = { count++, count++ } ; return 0 ; } Si clang -std=c++03 el código usando clang -std=c++03 produce la siguiente advertencia ( ejemplo en vivo ): warning: multiple unsequenced modifications to ‘count’ [-Wunsequenced] int arrInt[2] = { count++, count++ } […]

¿Puedo tomar la dirección del elemento one-past-the-end de una matriz?

Posible duplicado: Tome la dirección de un elemento de matriz de un extremo al otro a través del subíndice: ¿legal por el estándar de C ++ o no? int array[10]; int* a = array + 10; // well-defined int* b = &array[10]; // not sure… ¿Es la última línea válida o no?

¿La macro ‘offsetof’ de invoca un comportamiento indefinido?

Ejemplo de la implementación de MSVC: #define offsetof(s,m) \ (size_t)&reinterpret_cast((((s *)0)->m)) // ^^^^^^^^^^^ Como se puede ver, desreferencia un puntero nulo, que normalmente invoca un comportamiento indefinido. ¿Es esto una excepción a la regla o qué está pasando?

¿Es esta recursión infinita UB?

En C ++ 11, como un bucle infinito sin efectos secundarios, el siguiente progtwig es UB: int main() { while (true) {} } ¿Es el siguiente también UB? void foo() { foo(); } int main() { foo(); } Las citas del estándar para ambos progtwigs serían ideales.

¿Las mutaciones múltiples dentro del inicializador enumeran el comportamiento indefinido?

Tengo curiosidad sobre las listas de inicializadores y los puntos de secuencia. Hace un tiempo leí que el orden de evaluación en las listas de inicializadores es de izquierda a derecha. Si eso es así, entonces debe haber algún tipo de punto de secuencia entre los puntos de evaluación, ¿estoy equivocado? ¿Entonces con eso dicho […]