2016-10-02 4 views
0

Я пытаюсь понять, в чем преимущества безопасности типа. Но я чем-то смущен.Смутно о преимуществах безопасности типа

Основываясь на моем понимании безопасности типа, безопасность типов предотвращает смешивание несовместимых типов данных. Например, вы не можете назначить char* Ань int*:

char c = 'a'; 
int *p = &c; // this is not allowed (compiler error) 

Теперь я предполагаю, что выгода не позволяет такого назначения, потому что если бы я попытался разыменованием p я получить доступ к 3 дополнительных байт, что я не разрешен доступ.

Но в C++ я позволил сделать следующее:

int *p;  // I don't have to initialize p, and so it will have some junk/random value 
*p = 12345; // this will probably lead to segmentation fault! 

Так в основном в последнем примере я позволил сделать поведение, безопасность типа пытается предотвратить в первом примере! Я что-то упустил ?!

+3

Ваш второй пример раскрывает неопределенное поведение, не имеет ничего общего с безопасностью типа. –

+0

Ваш второй пример отменяет неинициализированный указатель. Это неопределенное поведение, так как 'p' указывает на произвольную ячейку памяти. – wulfgarpro

+0

Возможный дубликат [Ошибка сегментации при попытке печати значения в C] (http://stackoverflow.com/questions/11278085/segmentation-fault-when-attempting-to-print-value-in-c) – wulfgarpro

ответ

0

C++ - сложный язык, разработанный многими людьми в течение многих лет, поэтому невозможно найти чистое и четкое направление проектирования.

Одна из первоначальных идей заключалась, однако, в том, чтобы не препятствовать расширению скорости между C++ и ассемблером, поэтому язык в большинстве случаев приносил в жертву безопасность, когда это подразумевало бы стоимость исполнения.

Использование «неправильного типа» - это что-то сделано во время компиляции и не требует затрат во время выполнения. Проверка использования неинициализированных переменных (или запрещающих неинициализированных переменных, присутствующих на большинстве других языков) вместо этого потребует штрафа за временную стоимость, и поэтому он не учитывается.

+0

Комментарий, который я отвечал, исчез, –

+0

Почему компилятору сложно обнаружить неинициализированные переменные во время компиляции, разве это уже не сделано и отображается предупреждение ?! – Tom

+0

Да, это может обнаружить это и выпустить предупреждение - я был удивлен, что это было просто предупреждение, но, судя по всему, стандарты C++ 11 не требуют появления ошибки в этом случае. Однако просто рассматривайте все предупреждения как «ошибки» - они предупреждают вас о подозрительном коде. –

0

Эта вещь разрешена, поскольку C++ не отслеживает инициализацию переменных; ваш пример имеет ничего делать с типом безопасности (там нет несовместимости типов)

2

Я думаю, вы спрашиваете, может ли C++ защитить меня от некоторых ошибок, почему не все ошибки? Он может защитить вас от очевидных ошибок, но он не может защитить вас от каждой ошибки. Однако, как и ошибки, он также дает много предупреждений. В вашем примере, я получил предупреждение:

warning C4700: uninitialized local variable 'p' used  

Компилятор может видеть, что вы не инициализирован p, прежде чем сделать назначение.

Большинство мест, в которых я работал, настаивают на том, чтобы все предупреждения были зафиксированы до того, как все будет выпущено, что является хорошей политикой - обрабатывайте все предупреждения как ошибки!

Смежные вопросы