tacsheaven 2012-08-19 15:37:44

[C] そりゃ実装依存だけれども このエントリーをはてなブックマークに追加

投稿者からのアピールポイント

10年ほど前に関わった案件にて。けっこう嵌りました。malloc の実装依存部分に起因するエンバグ。 HP-UX ってこういう実装なんだ、と…

ソースがいろいろ変だったので修正。ちなみに型違いが原因ではありません。はまったのは malloc です。

// データベースからとってきたデータを保存する
// dbData は他のところで typedef struct 宣言済みです
dbData* buf = (dbData*)malloc(sizeof(dbData) * rowCount);
if(buf != null) {
  int i=0;
  for(i=0; i<rowCount; i++) {
    buf[i] = ...  // <- なぜかここで Segmentation Faultが…?
...

使い方ヒント: 「これは臭う」という行を見付けたら、各行のsmellをクリックしてマーキングしておきましょう(要Twitter OAuth認証)

コメント(11)

#1 ItSANgo 2012-08-19 04:36:42  

これ、bufの本来の型は何でしょう?それがわからないとすごく気持ちが悪いんですけど。

#2 noritan_org 2012-08-19 08:59:14  

(struct*)malloc(...)が変。sizeof(dbData)も変。(struct* dbData) buf =...も意味がわからない。単にコンパイルエラーを無視していて痛い目にあっただけに見えます。

#3 tacsheaven 2012-08-19 15:38:02  

いろいろ変だったのでソース修正しました

#4 customX_156 2012-08-25 14:18:42  

投稿者にウンコマークつけたい

#6 fresh_homepie 2013-01-20 10:55:26  

#include <stdlib.h> を忘れて関数宣言なし状態でmalloc使ったら落ちた、というように見えなくもない。

#7 EH500_Kintarou 2013-01-20 11:11:20  

おそらく投稿者が言いたいのはこのへんのことじゃないんですかねえ。
C言語はマニアックなところは非常にマニアックな言語なので、ウンコードの内容が高度すぎて誰も的確なコメントを返せないというwwwww

#8 3higo3 2013-01-21 00:19:03  

HPの仕様なんて知らないけど、添字移動するのに、dbDataの型サイズ加味する必要あったのかな? buf[ (dbData * i) ] = …みたいな

#9 mohno 2013-02-10 10:31:58  

↑ヘッダの付け忘れ? ソース修正したせいか、(書かれている部分は)まともなコードになってる(i = 0の重複はともかく)。「malloc の実装」って濡れ衣の予感。

#10 tsuyoshi_cho 2013-06-07 12:40:14  

むー、これは解答の回答がほしい。びみょーに普通に動くのになってない?

#11 keiichiroh 2013-06-09 01:25:44  

構造体アライメントの話って、昔の話じゃないと思ってたんだけど。
.Net でもマーシャリングで対応するための機能があって、dll呼び出しす時には普通に考慮しなきゃならんし。
http://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.structlayoutattribute.pack.aspx
http://www.pinvoke.net/default.aspx/user32/CreateIconFromResource.html

コメント投稿には、twitter認証が必要です。

Twitter認証

このウンコードに臭った人は、こちらのウンコードにも臭ってます

[その他] HOW TO ABC..

このエントリーをはてなブックマークに追加

実際にあった某システムの超重要なマスター...

create table item_master (
 A varchar(2...

鑑賞する »

[PHP] switch文の乱用

このエントリーをはてなブックマークに追加

臭うファイルがあったので開いてみたら・・...

switch($mode){
case "a":
case "b":
ca...

鑑賞する »

[その他] そのプレフィックスいる? & 予備・・・...

このエントリーをはてなブックマークに追加

ネーミングが日本語のローマ字っていうのも...

create table syain (
syain_bango int no...

鑑賞する »