Ситуация такова:
- 32-битное целочисленное переполнение
- malloc, ожидающий, что 64-битное целое использует это целое число как входное
Теперь на 64-битной машине, какой оператор корректен (если вообще есть):
Скажем, что подписанное двоичное целое 11111111001101100000101011001000 просто отрицательно из-за переполнения. Это практическая существующая проблема, поскольку вы можете выделить больше байтов, чем вы можете описать в 32-битном целочисленном. Но затем он считывается как 64-битное целое число.
-
Malloc
читает это как 64-битное целое число, нахожу11111111001101100000101011001000################################
, где # - бит подстановки, представляющий любые данные, хранящиеся после исходного целого. Другими словами, он читает результат, близкий к его максимальному значению 2 ^ 64, и пытается выделить несколько квантов. Он терпит неудачу. -
Malloc
читает это как 64-битное целое число, отбрасывая на0000000000000000000000000000000011111111001101100000101011001000
, возможно, потому, что он загружается в регистр, оставляя много битов ноль. Он не терпит неудачу, но выделяет отрицательную память, как будто читает положительное значение без знака. -
Malloc
читает это как 64-битное целое число, отбрасывая на################################11111111001101100000101011001000
, возможно, потому, что он загружается в регистр С# подстановочным знаком, представляющим любые данные ранее в регистре. Он не вполне непредсказуем в зависимости от последнего значения. - Целое число не переполняется вообще, потому что, хотя оно 32 бит, оно все еще находится в 64-битном регистре и поэтому malloc отлично работает.
Я действительно протестировал это, в результате чего malloc failing (что означало бы, что 1 или 3 будет правильным). Я предполагаю, что 1 является наиболее логичным ответом. Я также знаю исправление (используя size_t как вход вместо int).
Я просто хочу знать, что на самом деле происходит. По какой-то причине я не нахожу каких-либо разъяснений о том, как 32-битные целые числа фактически обрабатываются на 64-битных машинах для такого неожиданного "броска". Я даже не уверен, действительно ли это в регистре.