C Language
Zachowanie zdefiniowane w implementacji
Szukaj…
Uwagi
Przegląd
Standard C opisuje składnię języka, funkcje zapewniane przez bibliotekę standardową oraz zachowanie zgodnych procesorów C (z grubsza mówiąc, kompilatorów) i zgodnych programów C. W odniesieniu do zachowania standard w przeważającej części określa szczególne zachowania programów i procesorów. Z drugiej strony niektóre operacje mają jawne lub dorozumiane niezdefiniowane zachowanie - takich operacji zawsze należy unikać, ponieważ nie można na nich polegać. W międzyczasie istnieje wiele zachowań zdefiniowanych dla implementacji . Zachowania te mogą się różnić między procesorami C, środowiskami uruchomieniowymi i bibliotekami standardowymi (zbiorowo, implementacjami ), ale są spójne i niezawodne dla dowolnej implementacji, a zgodne implementacje dokumentują ich zachowanie w każdym z tych obszarów.
Czasami rozsądne jest, aby program polegał na zachowaniu zdefiniowanym przez implementację. Na przykład, jeśli program jest specyficzny dla konkretnego środowiska operacyjnego, wówczas prawdopodobnie nie będzie problemu poleganie na zachowaniach zdefiniowanych dla implementacji ogólnych dla typowych procesorów dla tego środowiska. Alternatywnie, można użyć dyrektyw kompilacji warunkowej, aby wybrać zachowania zdefiniowane w implementacji odpowiednie dla implementacji w użyciu. W każdym razie istotne jest, aby wiedzieć, które operacje mają zachowanie zdefiniowane w ramach implementacji, aby albo ich uniknąć, albo podjąć świadomą decyzję o tym, czy i jak z nich korzystać.
Zestawienie tych uwag stanowi listę wszystkich zachowań i cech zdefiniowanych w implementacji określonych w normie C2011, z odniesieniem do normy. Wiele z nich używa terminologii standardu . Niektóre inne opierają się bardziej ogólnie na kontekście standardu, na przykład osiem etapów tłumaczenia kodu źródłowego na program lub różnica między implementacjami hostowanymi i wolnostojącymi. Niektóre, które mogą być szczególnie zaskakujące lub godne uwagi, zostały przedstawione pogrubioną czcionką. Nie wszystkie opisane zachowania są obsługiwane przez wcześniejsze standardy C, ale ogólnie mówiąc, mają zachowanie zdefiniowane w implementacji we wszystkich wersjach standardu, które je obsługują.
Programy i procesory
Generał
Liczba bitów w jednym bajcie ( 3,6 / 3 ). Przynajmniej
8
rzeczywista wartość może byćCHAR_BIT
za pomocą makraCHAR_BIT
.Które komunikaty wyjściowe są uważane za „komunikaty diagnostyczne” ( 3.10 / 1 )
Tłumaczenie źródłowe
Sposób, w jaki znaki wielobajtowe fizycznego pliku źródłowego są mapowane na źródłowy zestaw znaków ( 5.1.1.2/1 ).
Określa, czy niepuste sekwencje białych znaków nowej linii są zastępowane pojedynczymi spacjami podczas fazy tłumaczenia 3 ( 5.1.1.2/1 )
Znaki zestawu wykonawczego, na które konwertowane są literały znakowe i znaki w stałych łańcuchowych (podczas fazy tłumaczenia 5), gdy poza tym nie ma odpowiadającego znaku ( 5.1.1.2/1 ).
Środowisko działania
Sposób identyfikacji komunikatów diagnostycznych, które mają być emitowane ( 5.1.1.3/1 ).
Nazwa i typ funkcji wywoływanej podczas uruchamiania w implementacji wolnostojącej ( 5.1.2.1/1 ).
Które biblioteki są dostępne w implementacji wolnostojącej, poza określonym zestawem minimalnym ( 5.1.2.1/1 ).
Wpływ zakończenia programu w środowisku wolnostojącym ( 5.1.2.1/2 ).
W środowisku hostowanym wszelkie dozwolone podpisy funkcji
main()
inne niżint main(int argc, char *arg[])
iint main(void)
( 5.1.2.2.1 / 1 ).Sposób, w jaki hostowana implementacja definiuje ciągi wskazane przez drugi argument
main()
( 5.1.2.2.1 / 2 ).Co stanowi „urządzenie interaktywne” do celów sekcji 5.1.2.3 (Wykonanie programu) i 7.21.3 (Pliki) ( 5.1.2.3/7 ).
Wszelkie ograniczenia dotyczące obiektów, do których odwołują się procedury obsługi przerwań w implementacji optymalizującej ( 5.1.2.3/10 ).
W implementacji wolnostojącej, czy obsługiwanych jest wiele wątków wykonania ( 5.1.2.4/1 ).
Wartości członków zestawu znaków wykonawczych ( 5.2.1 / 1 ).
Wartości
char
odpowiadające zdefiniowanym alfabetycznym sekwencjom ucieczki ( 5.2.2 / 3 ).Graniczne liczby całkowite i zmiennoprzecinkowe oraz charakterystyki ( 5.2.4.2/1 ).
Dokładność operacji arytmetycznych zmiennoprzecinkowych i konwersji standardowej biblioteki z wewnętrznych reprezentacji zmiennoprzecinkowych na reprezentacje łańcuchowe ( 5.2.4.2.2 / 6 ).
Wartość makra
FLT_ROUNDS
, która koduje domyślny tryb zaokrąglania zmiennoprzecinkowego ( 5.2.4.2.2 / 8 ).Zachowania zaokrąglania charakteryzujące się obsługiwanymi wartościami
FLT_ROUNDS
większymi niż 3 lub mniejszymi niż -1 ( 5.2.4.2.2 / 8 ).Wartość makra
FLT_EVAL_METHOD
, która charakteryzuje zachowanie zmiennoprzecinkowe ( 5.2.4.2.2 / 9 ).Zachowanie charakteryzujące się dowolnymi obsługiwanymi wartościami
FLT_EVAL_METHOD
mniejszymi niż -1 ( 5.2.4.2.2 / 9 ).Wartości makr
FLT_HAS_SUBNORM
,DBL_HAS_SUBNORM
iLDBL_HAS_SUBNORM
, charakteryzujące, czy standardowe formaty zmiennoprzecinkowe obsługują liczby nienormalne ( 5.2.4.2.2 / 10 )
Rodzaje
Wynik próby (pośredniego) dostępu do obiektu z czasem przechowywania wątku z wątku innego niż ten, z którym obiekt jest powiązany ( 6.2.4 / 4 )
Wartość
char
do którego przypisano znak spoza podstawowego zestawu wykonawczego ( 6.2.5 / 3 ).Obsługiwane rozszerzone typy liczb całkowitych ze znakiem, jeśli istnieją, ( 6.2.5 / 4 ) oraz wszelkie słowa kluczowe używane do ich identyfikacji.
Czy
char
ma taką samą reprezentację i zachowanie jaksigned char
lubunsigned char
( 6.2.5 / 15 ). Można zapytać oCHAR_MIN
, który jest albo0
alboSCHAR_MIN
jeślichar
jest odpowiednio niepodpisany lub podpisany.Liczba, kolejność i kodowanie bajtów w reprezentacjach obiektów , z wyjątkiem przypadków wyraźnie określonych przez standard ( 6.2.6.1/2 ).
Która z trzech rozpoznawanych form reprezentacji liczb całkowitych ma zastosowanie w danej sytuacji i czy pewne wzorce bitowe obiektów liczb całkowitych są reprezentacjami pułapek ( 6.2.6.2/2 ).
Wymóg dostosowania dla każdego typu ( 6.2.8 / 1 ).
Czy i w jakich kontekstach obsługiwane są jakiekolwiek rozszerzone dopasowania ( 6.2.8 / 3 ).
Zestaw obsługiwanych rozszerzonych dopasowań ( 6.2.8 / 4 ).
Konwersja liczb całkowitych obejmuje dowolne rozszerzone typy liczb całkowitych ze znakiem względem siebie ( 6.3.1.1/1 ).
Efekt przypisania wartości spoza zakresu do liczby całkowitej ze znakiem ( 6.3.1.3/3 ).
W przypadku gdy w zasięgu, ale wartość nieprzedstawialne jest przypisany do obiektów zmiennoprzecinkowej, jak wartość reprezentacja jest przechowywany w obiekcie jest wybrany z pomiędzy dwoma najbliższymi do zakodowania wartości ( 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 ).
Wynik konwersji liczby całkowitej na typ wskaźnika , z wyjątkiem wyrażeń stałych całkowitoliczbowych o wartości
0
( 6.3.2.3/5 ).
Formularz źródłowy
Lokalizacje w dyrektywach
#pragma
których rozpoznawane są tokeny nazw nagłówków ( 6.4 / 4 ).Znaki, w tym znaki wielobajtowe, inne niż podkreślenie, nieakcentowane litery łacińskie, nazwy znaków uniwersalnych i cyfry dziesiętne, które mogą pojawiać się w identyfikatorach ( 6.4.2.1/1 ).
Liczba znaczących znaków w identyfikatorze ( 6.4.2.1/5 ).
Z pewnymi wyjątkami sposób, w jaki znaki źródłowe w stałej liczb całkowitych są odwzorowywane na znaki zestawu wykonawczego ( 6.4.4.4/2 ; 6.4.4.4/10 ).
Bieżące ustawienia narodowe używane do obliczania wartości szerokiej stałej znakowej oraz większość innych aspektów konwersji dla wielu takich stałych ( 6.4.4.4/11 ).
Określa, czy znaczniki literału o różnym przedrostku mogą być konkatenowane, a jeśli tak, traktowanie wynikowej sekwencji znaków wielobajtowych ( 6.4.5 / 5 )
Ustawienia narodowe używane podczas fazy tłumaczenia 7 do konwersji literałów szerokiego łańcucha na wielobajtowe sekwencje znaków oraz ich wartość, gdy wynik nie jest reprezentatywny w zestawie znaków wykonania ( 6.4.5 / 6 ).
Sposób mapowania nazw nagłówków na nazwy plików ( 6.4.7 / 2 ).
Ocena
Określa, czy i jak wyrażenia zmiennoprzecinkowe są
FP_CONTRACT
gdy nie jest używanyFP_CONTRACT
( 6.5 / 8 ).Wartości wyników
sizeof
i_Alignof
( 6.5.3.4/5 ).Wielkość typu wyniku odejmowania wskaźnika ( 6.5.6 / 9 ).
Wynik przesunięcia w prawo liczby całkowitej ze znakiem o wartości ujemnej ( 6.5.7 / 5 ).
Zachowanie w czasie wykonywania
Stopień skuteczności słowa kluczowego
register
( 6.7.1 / 6 ).Określa, czy typ pola bitowego zadeklarowanego jako
int
jest tego samego typu, counsigned int
czy jakosigned int
( 6.7.2 / 5 ).Jakie typy pól bitowych mogą przyjmować, inne niż opcjonalnie kwalifikowane
_Bool
,signed int
iunsigned int
; czy pola bitowe mogą mieć typy atomowe ( 6.7.2.1/5 ).Aspekty tego, jak implementacje rozkładają pamięć dla pól bitowych ( 6.7.2.1/11 ).
Wyrównanie członków struktur i związków niebędących bitfieldami ( 6.7.2.1/14 ).
Typ podstawowy dla każdego wyliczonego typu ( 6.7.2.2/4 ).
Co stanowi „dostęp” do obiektu typu
volatile
( 6.7.3 / 7 ).Skuteczność deklaracji funkcji
inline
( 6.7.4 / 6 ).
Preprocesor
Czy stałe znaków są konwertowane na wartości całkowite w taki sam sposób w warunkach wstępnych procesora jak w wyrażeniach zwykłych i czy stała jednoznakowa może mieć wartość ujemną ( 6.10.1 / 4 ).
Lokalizacje szukały plików wskazanych w dyrektywie
#include
( 6.10.2 / 2-3 ).Sposób, w jaki nazwa nagłówka jest tworzona na podstawie tokenów dyrektywy
#include
zawierającej wiele tokenów ( 6.10.2 / 4 ).Limit
#include
nesting ( 6.10.2 / 6 ).Czy znak
\
jest wstawiany przed\
wprowadzeniem uniwersalnej nazwy znaku w wyniku operatora#
preprocesora ( 6.10.3.2/2 ).Zachowanie dyrektywy
#pragma
przetwarzania wstępnego dla pragmatów innych niżSTDC
( 6.10.6 / 1 ).Wartość makr
__DATE__
i__TIME__
jeśli odpowiednio nie jest dostępna data ani godzina tłumaczenia ( 6.10.8.1/1 ).Wewnętrzne kodowanie znaków używane dla
wchar_t
jeśli makro__STDC_ISO_10646__
nie jest zdefiniowane ( 6.10.8.2/1 ).Wewnętrzne kodowanie znaków używane dla
char32_t
jeśli makro__STDC_UTF_32__
nie jest zdefiniowane ( 6.10.8.2/1 ).
Biblioteka standardowa
Generał
- Format komunikatów emitowanych w przypadku niepowodzenia asercji ( 7.2.1.1/2 ).
Funkcje środowiska zmiennoprzecinkowego
Wszelkie dodatkowe wyjątki zmiennoprzecinkowe poza tymi zdefiniowanymi w normie ( 7.6 / 6 ).
Wszelkie dodatkowe tryby zaokrąglania zmiennoprzecinkowego poza tymi zdefiniowanymi w normie ( 7.6 / 8 ).
Wszelkie dodatkowe środowiska zmiennoprzecinkowe poza zdefiniowanymi w normie ( 7.6 / 10 ).
Domyślna wartość zmiennoprzecinkowego przełącznika dostępu do środowiska ( 7.6.1 / 2 ).
Reprezentacja zmiennych stanu zmiennoprzecinkowego zarejestrowanych przez
fegetexceptflag()
( 7.6.2.2/1 ).Czy funkcja
feraiseexcept()
dodatkowo podnosi wyjątek zmiennoprzecinkowy „niedokładny”, ilekroć podnosi wyjątek zmiennoprzecinkowy „przepełnienie” lub „niedomiar” ( 7.6.2.3/2 ).
Funkcje związane z ustawieniami regionalnymi
- Ciągi ustawień narodowych inne niż
"C"
obsługiwane przezsetlocale()
( 7.11.1.1/3 ).
Funkcje matematyczne
Typy reprezentowane przez
float_t
idouble_t
gdy makroFLT_EVAL_METHOD
ma wartość inną niż0
,1
i2
( 7.12 / 2 ).Wszelkie obsługiwane klasyfikacje zmiennoprzecinkowe poza tymi zdefiniowanymi w normie ( 7.12 / 6 ).
Wartość zwrócona przez
math.h
działa w przypadku błędu domeny ( 7.12.1 / 2 ).Wartość zwrócona przez
math.h
działa w przypadku błędu bieguna ( 7.12.1 / 3 ).Wartość zwracana przez
math.h
działa, gdy wynik jest poniżej wartości, oraz aspekty określające, czyerrno
jest ustawione naERANGE
i czy w takich okolicznościach powstaje wyjątek zmiennoprzecinkowy ( 7.12.1 / 6 ).Domyślna wartość przełącznika skurczu FP ( 7.12.2 / 2 ).
Określa, czy funkcje
fmod()
zwracają 0, czyfmod()
błąd domeny, gdy ich drugim argumentem jest 0 ( 7.12.10.1/3 ).Określa, czy
remainder()
funkcjeremainder()
zwracają 0, czy zgłaszają błąd domeny, gdy ich drugim argumentem jest 0 ( 7.12.10.2/3 ).Liczba znaczących bitów w
remquo()
ilorazowych obliczonych przez funkcjeremquo()
( 7.12.10.3/2 ).Określa, czy funkcje
remquo()
zwracają 0, czyremquo()
błąd domeny, gdy ich drugim argumentem jest 0 ( 7.12.10.3/3 ).
Sygnały
Pełny zestaw obsługiwanych sygnałów, ich semantyka i ich domyślna obsługa ( 7.14 / 4 ).
Gdy sygnał zostanie podniesiony, a do tego sygnału przypisana jest niestandardowa procedura obsługi, która ewentualne sygnały są blokowane na czas wykonywania procedury obsługi ( 7.14.1.1/3 ).
Które sygnały inne niż
SIGFPE
,SIGILL
iSIGSEGV
powodują, że zachowanie po powrocie z niestandardowej procedury obsługi sygnału jest niezdefiniowane ( 7.14.1.1/3 ).Które sygnały są początkowo skonfigurowane do ignorowania (niezależnie od ich domyślnej obsługi; 7.14.1.1/6 ).
Różne
- Określona stała wskaźnika zerowego, do którego rozwija się makro
NULL
( 7,19 / 3 ).
Funkcje obsługi plików
Czy ostatni wiersz strumienia tekstowego wymaga kończącego znaku nowej linii ( 7.21.2 / 2 ).
Liczba znaków pustych automatycznie dołączanych do strumienia binarnego ( 7.21.2 / 3 ).
Początkowa pozycja pliku otwartego w trybie dołączania ( 7.21.3 / 1 ).
Czy zapis w strumieniu tekstu powoduje obcinanie strumienia ( 7.21.3 / 2 ).
Obsługa buforowania strumienia ( 7.21.3 / 3 ).
Czy faktycznie istnieją pliki o zerowej długości ( 7.21.3 / 4 ).
Zasady tworzenia poprawnych nazw plików ( 7.21.3 / 8 ).
Czy ten sam plik może być jednocześnie otwierany wiele razy ( 7.21.3 / 8 ).
Charakter i wybór kodowania znaków wielobajtowych ( 7.21.3 / 10 ).
Zachowanie funkcji
remove()
gdy plik docelowy jest otwarty ( 7.21.4.1/2 ).Zachowanie funkcji
rename()
gdy plik docelowy już istnieje ( 7.21.4.2/2 ).Czy pliki utworzone za pomocą funkcji
tmpfile()
są usuwane w przypadku nieprawidłowego zakończenia pracy programu ( 7.21.4.3/2 ).Który tryb zmienia się, w jakich okolicznościach dozwolone są przez
freopen()
( 7.21.5.4/3 ).
Funkcje we / wy
Które z dozwolonych reprezentacji nieskończonych i nie-liczbowych wartości FP są generowane przez funkcje rodziny printf () - ( 7.21.6.1/8 ).
Sposób, w jaki wskaźniki są formatowane przez
printf()
rodzinyprintf()
( 7.21.6.1/8 ).Zachowanie rodziny
scanf()
funkcjonuje, gdy znak-
pojawia się na wewnętrznej pozycji listy skanowania w polu[
7.21.6.2/12 ).Większość aspektów obsługi pól
p
funkcjescanf()
( 7.21.6.2/12 ).Wartość
errno
ustawiona przezfgetpos()
w przypadku niepowodzenia ( 7.21.9.1/2 ).Wartość
errno
ustawiona przezfsetpos()
w przypadku niepowodzenia ( 7.21.9.3/2 ).Wartość
errno
ustawiona przezftell()
w przypadku niepowodzenia ( 7.21.9.4/3 ).Znaczenie funkcji
strtod()
niektórych obsługiwanych aspektów formatowania NaN ( 7.22.1.3p4 ).Określa, czy funkcje
strtod()
ustawiająerrno
naERANGE
gdy wynik jest niedostateczny ( 7.22.1.3/10 ).
Funkcje alokacji pamięci
- Zachowanie funkcji alokacji pamięci, gdy żądana liczba bajtów wynosi 0 ( 7.22.3 / 1 ).
Funkcje środowiska systemowego
Jakie ewentualne czyszczenia są wykonywane i jaki status jest zwracany do systemu operacyjnego hosta po wywołaniu funkcji
abort()
( 7.22.4.1/2 ).Jaki status jest zwracany do środowiska hosta po wywołaniu metody
exit()
( 7.22.4.4/5 ).Obsługa otwartych strumieni i jaki status jest zwracany do środowiska hosta, gdy
_Exit()
jest_Exit()
( 7.22.4.5/2 ).Zbiór nazw środowiska dostępnych za pośrednictwem
getenv()
i metoda zmiany środowiska ( 7.22.4.6/2 ).Zwracana wartość funkcji
system()
( 7.22.4.8/3 ).
Funkcje daty i godziny
Lokalna strefa czasowa i czas letni ( 7.27.1 / 1 ).
Zakres i precyzja czasów reprezentowanych przez typy
clock_t
itime_t
( 7.27.1 / 4 ).Początek ery, która służy jako odniesienie dla czasów zwracanych przez funkcję
clock()
( 7.27.2.1/3 ).Początek epoki, która służy jako odniesienie dla czasów zwracanych przez funkcję
timespec_get()
(gdy podstawą czasu jestTIME_UTC
; 7.27.2.5/3 ).Zastąpienie
strftime()
dla specyfikatora konwersji%Z
w ustawieniach regionalnych „C” ( 7.27.3.5/7 ).
Szeroko znakowe funkcje we / wy
Które z dozwolonych reprezentacji nieskończonych i nie-liczbowych wartości FP są generowane przez funkcje rodziny
wprintf()
( 7.29.2.1/8 ).Sposób, w jaki wskaźniki są formatowane przez funkcje rodziny
wprintf()
( 7.29.2.1/8 ).Zachowanie
wscanf()
-funkcji działa, gdy znak-
pojawia się na wewnętrznej pozycji listy skanowania[
pola ( 7.29.2.2/12 ).Większość aspektów
wscanf()
pólp
funkcjewscanf()
( 7.29.2.2/12 ).Znaczenie funkcji rodziny
wstrtod()
niektórych obsługiwanych aspektów formatowania NaN ( 7.29.4.1.1 / 4 ).Określa, czy funkcje
wstrtod()
ustawiająerrno
naERANGE
gdy wynik jest niedostateczny ( 7.29.4.1.1 / 10 ).
Prawe przesunięcie ujemnej liczby całkowitej
int signed_integer = -1;
// The right shift operation exhibits implementation-defined behavior:
int result = signed_integer >> 1;
Przypisywanie wartości spoza zakresu do liczby całkowitej
// Supposing SCHAR_MAX, the maximum value that can be represented by a signed char, is
// 127, the behavior of this assignment is implementation-defined:
signed char integer;
integer = 128;
Przydział zero bajtów
// The allocation functions have implementation-defined behavior when the requested size
// of the allocation is zero.
void *p = malloc(0);
Reprezentacja podpisanych liczb całkowitych
Każdy podpisany typ liczb całkowitych może być reprezentowany w jednym z trzech formatów; który jest zdefiniowany w implementacji, który jest używany. Implementacja używana dla dowolnego określonego typu liczby całkowitej co najmniej tak szerokiej jak int
może być określona w czasie wykonywania na podstawie dwóch bitów najniższego rzędu reprezentacji wartości -1
w tym typie, tak jak:
enum { sign_magnitude = 1, ones_compl = 2, twos_compl = 3, };
#define SIGN_REP(T) ((T)-1 & (T)3)
switch (SIGN_REP(long)) {
case sign_magnitude: { /* do something */ break; }
case ones_compl: { /* do otherwise */ break; }
case twos_compl: { /* do yet else */ break; }
case 0: { _Static_assert(SIGN_REP(long), "bogus sign representation"); }
}
Ten sam wzorzec dotyczy reprezentacji węższych typów, ale nie można ich przetestować za pomocą tej techniki, ponieważ argumenty &
podlegają „zwykłej konwersji arytmetycznej” przed obliczeniem wyniku.