次のコードは、EXC_BAD_ACCESS エラー (具体的には一般保護違反エラー) をスローします。ブロック ポインターをミスアラインして実行できない理由を知りたいです。
#include <stdio.h>
int main(int argc, const char * argv[])
{
void (^blocky)() = ^{
printf("Hello!\n");
printf("Hello Again!\n");
};
blocky = *(&blocky+1);
blocky = *(&blocky-1);
blocky();
return 0;
}
しかし、次の作品:
#include <stdio.h>
int main(int argc, const char * argv[])
{
void (^blocky)() = ^{
printf("Hello!\n");
printf("Hello Again!\n");
};
blocky = *(&blocky+1-1);
blocky();
return 0;
}
編集(コードブロックのずれに対する回答):
ブロックを構造体のように扱うと、メモリ内の実行可能コードを指す値が、ブロックの先頭から 16 バイトのオフセットであり、長さが 8 バイトであることがわかります。
この値を変更して、実行をメモリ内の別の場所に効果的に向けることができます。通常、これはクラッシュします。
別の実行可能コードのメモリ内の特定のアドレスを知っていると仮定すると、そこにそれを向けることができます。
これが便利な理由: 便利ではありません。絶対にしないでください。本当。一度もない。