Lint ( http://www.gimpel.com/html/pub/msg.txtの 740 ) から、union へのポインターを unsigned へのポインターにキャストしないように警告するという警告を受け取りました。長いです。互換性のない型をキャストしていることはわかっていたので、 reinterpret_cast を使用していましたが、それでも警告が表示されて驚きました。
例:
// bar.h
void writeDWordsToHwRegister(unsigned long* ptr, unsigned long size)
{
// write double word by double word to HW registers
...
};
// foo.cpp
#include "bar.h"
struct fooB
{
...
}
union A
{
unsigned long dword1;
struct fooB; // Each translation unit has unique content in the union
...
}
foo()
{
A a;
a = ...; // Set value of a
// Lint warning
writeDWordsToHwRegister(reinterpret_cast<unsigned long*> (&a), sizeof(A));
// My current triage, but a bad one since someone, like me, in a future refactoring
// might redefine union A to include a dword0 variable in the beginning and forget
// to change below statement.
writeDWordsToHwRegister(reinterpret_cast<unsigned long*> (&(a.dword1)), sizeof(A));
}
私がそれを行っていた理由と、それを最良の方法で解決する方法を正確に脇に置いて(インターフェイスのvoid *とwriteDWordsToHwRegisterのunsigned long *にキャストしますか?)、Lint警告を読むと、一部のマシンではcharへのポインターに違いがあることが説明されましたと単語へのポインタ。誰かがその違いがどのように現れるかを説明し、これらの違いを示すいくつかのプロセッサの例を挙げてもらえますか? アラインメントの問題について話しているのですか?
組み込みシステムであるため、エキゾチックな社内コアを使用しているため、悪いことが起こる可能性がある場合は、おそらくそうなるでしょう。