スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ppmck release9 ex5.1

ppmck release 9 ex 5.1をリリースしました。

2009/11/28 release 9 ex5.1

nesasmのバグ修正。srcディレクトリ内Makefileの調節。
sounddrv.hの長過ぎるラベルを32文字以内に修正。



ダウンロードはこちらからどうぞ
スポンサーサイト

nesasmバグ調査

たまにはバグ調査。

バグ :
特定環境(Linuxなど)でオーバーフローが発生する、もしくはラベルが定義されていないと表示される。

調査:
Win32やMac OS Xではバグが発生しないというのは不可解なので、gdbにて調査してみました。

nesasmのテキスト処理はexpr.cが行うのですが、
テキストからシンボルを得るgetsym()は、

if (isalpha(c) || c == '_' || c == '.' || (isdigit(c) && i >= 1)) {
if (i < SBOLSZ - 1)
symbol[++i] = c;
....


となっており、文字列の長さの調節を行うという意味では正しく処理されていました。

ということで、問題は、この短縮されたシンボルが正しく探せないということにあります。
nesasmでは利便性の為かPascalのような方法で文字列を取り扱っていて、
配列の最初に文字列の長さが格納されます。

そのため、シンボルを一時的に格納するsymbolの配列は、

char symbol[SBOLSZ+1]; /* temporary symbol storage */


となっています。

しかし、シンボルを格納するための構造体は、

typedef struct t_symbol {
...
char name[SBOLSZ];
..
} t_symbol;:


となっていて、symbolをstrcpyで構造体のname配列にそのまま格納した場合、
最後の1文字(フルに使った場合はヌル文字になる)が領域外にコピーされるという事になります。

結果として格納した文字列とsymbolがstrcmpで正しく比較できないなど、
問題が発生することになるようです。

#修正したものは後ほど…

プロフィール

BouKiCHi

Author:BouKiCHi
ABOUT ME
MAIL:alf_byncyou at hotmail.com

WEB:http://clogging.web.fc2.com/
TWITTER:@bkc_alf

月別アーカイブ

FC2カウンター

ブロとも申請フォーム

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。