Каково различие между - символьный, и - совместно использовал флаги GCC?

Вы действительно хотите, чтобы тест выполнял одну вещь и проверял ее. Если вы не уверены, какое именно исключение будет выдано, для меня это не будет хорошим испытанием.

например. (в псевдокоде)

try {
   badOperation();
   /// looks like we succeeded. Not good! Fail the test
   fail();
}
catch (ExpectedException e) {
   // that's fine
}
catch (UnexpectedException e) {
   // that's NOT fine. Fail the test
}

, поэтому, если вы хотите проверить, что ваш метод выдает 2 разных исключения (для 2 наборов входных данных), вам понадобится 2 теста.

9
задан Joseph Garvin 20 October 2009 в 15:20
поделиться

1 ответ

Резюме: -символика предотвращает взаимное наложение функций внутри совместно используемых объектов

Связывание с совместно используемыми объектами позволяет использовать функцию, называемую взаимным расположением символов. Идея состоит в том, что вы можете «вставить» новое определение глобального символа так, чтобы оно называлось, а не «обычное» определение.

Одним из классических примеров является malloc (). Чаще всего malloc () определяется в libc. Но вы можете вставить свою собственную версию malloc, загрузив библиотеку, которая определяет этот символ, перед загрузкой libc (большинство компоновщиков времени выполнения позволяют вам использовать LD_PRELOAD для определенных библиотек для загрузки перед исполняемым файлом).

По умолчанию, любая функция в пределах общий объект, который не является статическим, является глобальным символом. Из-за этого можно вставлять любые функции в общем объекте. Рассмотрим сценарий, в котором общий объект имеет функцию high_level () и low_level (), а high_level () вызывает low_level () как часть своей реализации, и ни high_level (), ни low_level () не являются статическими функциями.

Можно вставить low_level () таким образом, чтобы high_level () вызывала low_level () из другого разделяемого объекта.

Здесь на помощь приходит -symbolic. При создании вашего общего объекта компоновщик увидит, что low_level () определяется в том же общем объекте, что и high_level (), и связывает вызов таким образом, чтобы его нельзя было вставить. Таким образом, вы знаете, что любые вызовы одной функции в вашем общем объекте к другой в том же общем объекте никогда не будут вставлены.

s, и ни high_level (), ни low_level () не являются статическими функциями.

Можно вставить low_level () таким образом, чтобы high_level () вызывала low_level () из другого разделяемого объекта.

Здесь на помощь приходит -symbolic. При создании вашего общего объекта компоновщик увидит, что low_level () определяется в том же общем объекте, что и high_level (), и связывает вызов таким образом, чтобы его нельзя было вставить. Таким образом, вы знаете, что любые вызовы одной функции в вашем общем объекте к другой в том же общем объекте никогда не будут вставлены.

s, и ни high_level (), ни low_level () не являются статическими функциями.

Можно вставить low_level () таким образом, чтобы high_level () вызывала low_level () из другого разделяемого объекта.

Здесь на помощь приходит -symbolic. При создании вашего общего объекта компоновщик увидит, что low_level () определяется в том же общем объекте, что и high_level (), и связывает вызов таким образом, чтобы его нельзя было вставить. Таким образом, вы знаете, что любые вызовы одной функции в вашем общем объекте к другой в том же общем объекте никогда не будут вставлены.

компоновщик увидит, что low_level () определен в том же общем объекте, что и high_level (), и свяжет вызов так, чтобы его нельзя было вставить. Таким образом, вы знаете, что любые вызовы одной функции в вашем общем объекте к другой в том же общем объекте никогда не будут вставлены.

компоновщик увидит, что low_level () определен в том же общем объекте, что и high_level (), и свяжет вызов так, чтобы его нельзя было вставить. Таким образом, вы знаете, что любые вызовы одной функции в вашем общем объекте к другой в том же общем объекте никогда не будут вставлены.

7
ответ дан 4 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: