これは迷信ではなく、よくある間違いです。この間違いの最悪なところは、書いた本人も、自分がどう書いたのかをほとんど自覚していないところにあります。実際、「ソースファイルの末尾に}」と指摘しただけでは、具体的にどういう状況なのか分からない場合も少なくないでしょう。
| 0 1 2 3 4 5 6 7 8 | #include <stdio.h> int main(void) {   puts("Hello, World!");   return 0; }[EOF] | 
今回問題としているのは、上のように最後の}のあとに改行がなく、そこでファイルが終わっている場合に未定義の動作を引き起こすということです。C言語の規格であるJIS X3010:2003では、
5.1.1.2 翻訳フェーズ (中略)
(2) (中略)空でないソースファイルは,改行文字で終了しなければならない。さらに,この改行文字の直前に(接合を行う前の時点で)逆斜線があってはならない。
と規定されており、C++の規格であるJIS X3014:2003では、
2.1 翻訳過程 (中略)
2) (中略)空でないソースファイルが改行文字で終わっていない場合,その動作は,未定義とする。空でないソースファイルが逆斜線に続く改行文字で終わっている場合,その動作は,未定義とする。
と規定されています。
この問題は、ファイルの末尾に}がある場合だけでなく、主にヘッダファイルで、末尾に#endifがある場合にもよく発生します。特に、改行文字が何らかの記号として表示されないエディタ(統合開発環境を含む)や、EOFが表示されないエディタを使っている場合は要注意です。
ところで、先ほど引用した2つの規格は、C言語はC99、C++はC++03のもので今となってはかなり古い内容です。その後のバージョンアップではどうなったかも気になるところです。
C言語ではC17でも以前と同様末尾には改行が必要ですが、C++ではC++11以降は末尾に改行がなければ改行文字が追加されることになっています。このように、C言語とC++では事情が変わってきていますので、(両方使う方は特に)末尾は必ず改行で終わるようにしておいた方がいいでしょう。

![[迷信] 2の累乗による割り算と右シフトは等価](https://www.kijineko.co.jp/wp-content/uploads/2021/06/3109898_s.jpg)
![[迷信] getsは単純にfgetsに置き換えられる](https://www.kijineko.co.jp/wp-content/uploads/2021/06/5063693_s.jpg)
![[迷信] データ列のソートにはqsort関数を使うべし](https://www.kijineko.co.jp/wp-content/uploads/2021/06/4928218_s.jpg)
![[迷信] コンパイラはプログラマの心を察してくれる](https://www.kijineko.co.jp/wp-content/uploads/2021/06/709817_s.jpg)
![[迷信] sizeofは定数式](https://www.kijineko.co.jp/wp-content/uploads/2021/06/4882007_s.jpg)
![[迷信] freeにNULLを渡すとクラッシュする](https://www.kijineko.co.jp/wp-content/uploads/2021/06/4905202_s.jpg)