Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Operacje na wskaźniku - kiedy standard określa niezdefiniowane zachowanie?

Ostatnio zmodyfikowano 2015-01-05 21:52
Autor Wiadomość
DejaVu
» 2015-01-03 21:06:08
@Kaikso: Nie powołuj się na kompilatory bo to żaden argument. Kompilatory w wielu miejscach zachowują się znacznie lepiej niż standard przewiduje. Nie oznacza to jednak, że na innej, np. niszowej platformie przedstawiony przez Ciebie kod będzie miał niezdefiniowane zachowanie. Poza tym poniżej została napisana słuszna uwaga.
P-123998
SocrateZ
» 2015-01-03 21:06:49
ponieważ wartość tekst - 1 zostanie obliczona podczas kompilacji
Powiedz mi skąd kompilator podczas kompilacji będzie wiedział jaki adres w pamięci przydzieli program tablicy tekst?
P-123999
Kaikso
» 2015-01-03 21:11:55
Powiedz mi skąd kompilator podczas kompilacji będzie wiedział jaki adres w pamięci przydzieli program tablicy tekst?
Adresy są obliczane przez kompilator lub konsolidator.

@DejaVu: systemy operacyjne muszą wykonywać takie operacje, aby sprawnie zarządzać pamięcią. Masz rację że kompilatory zachowują się o wiele lepiej niż przewiduje standard, właśnie dlatego lepiej korzystać ze standardów takich jak gnu99.
P-124001
DejaVu
» 2015-01-03 21:16:44
Powiedz mi skąd kompilator podczas kompilacji będzie wiedział jaki adres w pamięci przydzieli program tablicy tekst?
Adresy są obliczane przez kompilator lub konsolidator.
Pod warunkiem, że są znane w trakcie kompilacji, a adres wskazanej zmiennej wyląduje na stosie, więc nie jest znany w czasie kompilacji.

systemy operacyjne muszą wykonywać takie operacje, aby sprawnie zarządzać pamięcią. Masz rację że kompilatory zachowują się o wiele lepiej niż przewiduje standard, właśnie dlatego lepiej korzystać ze standardów takich jak gnu99.
A skąd wiesz czy ten kod nie będzie kompilowany np. na architekturze, której nie ma w obrocie publicznym i tym samym na kompilatorze, który opiera się strice o założenia standardu oraz na urządzeniu, które sprzętowo kontroluje poprawność adresowania pamięci, bo ma np. dedykowane instrukcje do przesuwania adresów pamięci i nie używa add/sub?
P-124004
SocrateZ
» 2015-01-03 21:18:09
@up
Dokładnie.
Tutaj więcej o tym: http://stackoverflow.com​/questions/18446171​/how-do-compilers-assign-memory-addresses-to-variables
W tym wypadku kompilator nie ma prawa znać adresu zmiennej tekst.

The compiler does perform some variable placment and alignment relative to base-adresses which are obtained by the program/standard library at runtime.
P-124005
Kaikso
» 2015-01-03 21:22:03
Poza tym można sprawdzić pod jakim kompilatorem jest kompilowany kod przy użyciu preprocesora, a dla niewspieranych kompilatorów
#waring "The program may have undefined behavior"
. I jak najczęściej unikać takich miejsc.

@Up: Dlatego takie tematy są rozwijane aż problem zostanie rozwiązany ;)
P-124006
DejaVu
» 2015-01-03 21:25:26
@Kaikso: jest cała masa rzeczy, która działa w określonych kompilatorach i zwraca zawsze określoną wartość, a mimo to jest to zachowanie opisane jako niezdefiniowane. Poza tym po co pisać kod, który ma niezdefiniowane zachowanie i robić 'warunki' na 'inne' kompilatory? Nie będziesz przeglądał miliona linii kodu w projekcie jeżeli będziesz chciał go przenieść na inną platformę. Kod ma być zgodny ze standardem, a nie zgodny z wizjami programisty 'bo u mnie działa'. Wyobraź sobie, że jest np. architektura, która ma instrukcje:
C/C++
pointer.set( numerek );
pointer.sub( 1 );
pointer.add( strlen( zmienna ) );
i teraz:
RejestrX = numerek;
RejestrY = 0;
RejestrY = RejestrY - 1;
RejestrY = RejestrY + strlen(zmienna);
Adres = RejestrX + RejestrY;
Wyjście poza wartość 0 dla RejestrY jest sprzętowym naruszeniem pamięci, a kompilator niszowej platformy wygenerował kod zgodnie z życzeniem programisty.
P-124007
Kaikso
» 2015-01-03 21:27:30
@DejaVu: Czasami jest to praktyczniejsze rozwiązanie, jak np. w kodzie Linux-a.
P-124008
1 2 « 3 » 4 5 6 7 8
Poprzednia strona Strona 3 z 8 Następna strona