[ CnUnix ] in KIDS 글 쓴 이(By): ddaeng (金京哲) 날 짜 (Date): 1993년10월31일(일) 19시49분38초 KST 제 목(Title): 우왕.. 이거 골때려여.. 으.. 회사서 골때리는 케이스를 당해써여... 문제는 HP735기계에서.. HPUX 9.01을 쓰문서.. 이러면서 어떤 프로그램을 컴파일을 했는데.. 그게 잘 안돌아여... 고노무게.. HP730/HPUX8.05에선 문제읍시 잘 돌던 거거덩여.. 하이간.. 잠시간의 삽질로 그 문제를 피해가는 방법을 찾아냈는데.. 여기다가 한번 써볼께여.. 문제의 프로그램은.. malloc으로 받은 메모리 블럭의 일부를 그 블럭내부의 다른곳으로 옮기는게 목적이엇어여.. ------------ InsertHandleSize(insertpos, addsize) unsigned long insertpos, addsize; { char *tmp; int newsize; int j; ....... 331: for( j = newsize-1; j >= insertpos+addsize; j--) 332: *(tmp+j) = *(tmp+j-addsize); ....... } ------------- 이게 보시다시피..(tmp+insertpos)를 (tmp+insertpos+addsize)로 카피하는건디.. 시상에.. 이게 안대드라구여.. 8.05에선 물론 잘 대구여.. 그 부분을 디스어셈불 한 결과는 다음과 같아여.. 이거.. PA-RISC니모닉인디.. ------------ 332: 0x0001d554 InsertHa+0138 LDW -68(0,30),21 0x0001d558 InsertHa+013c LDW -76(0,30),22 0x0001d55c InsertHa+0140 ADD 22,21,1 0x0001d560 InsertHa+0144 LDW -172(0,30),31 0x0001d564 InsertHa+0148 EXTRS 31,31,4,19 0x0001d568 InsertHa+014c SUB 0,19,20 0x0001d56c InsertHa+0150 LDBX,S 20(0,1),21 0x0001d570 InsertHa+0154 EXTRS 21,31,8,22 0x0001d574 InsertHa+0158 LDW -68(0,30),1 0x0001d578 InsertHa+015c LDW -76(0,30),31 0x0001d57c InsertHa+0160 ADD 31,1,19 0x0001d580 InsertHa+0164 STBS 22,0(0,19) 0x0001d584 InsertHa+0168 LDW -68(0,30),20 0x0001d588 InsertHa+016c LDO -1(20),21 0x0001d58c InsertHa+0170 STW 21,-68(0,30) 0x0001d590 InsertHa+0174 LDW -68(0,30),22 0x0001d594 InsertHa+0178 LDW -168(0,30),1 0x0001d598 InsertHa+017c LDW -172(0,30),31 0x0001d59c InsertHa+0180 ADD 1,31,19 0x0001d5a0 InsertHa+0184 COMBF,<< 22,19,InsertHandleSize+013 0x0001d5a4 InsertHa+0188 OR 0,0,0 ------------ 하이간에.. 이 문제를 해결하는 방법을 두개를 찾았아여.. 1) 포인터 조작을 간단하게... ---------- int ti; ....... for( j = newsize-1; j >= insertpos+addsize; j--) { ti = j - addsize; *(tmp+j) = *(tmp+ti); } ....... ---------- 루프내의 어사인먼트 하는걸 *(tmp+j-addsize)를, j-addsize를 먼저 계산해서 ti에 넣구서 *(tmp+ti)하니까 되데여.. 2) memmove()를 이용해서.. ---------- memmove( tmp+insertpos+addsize, tmp+insertpos, newsize-(insertpos+addsize) ); ---------- 이러케 해두 대드라구여... 하여간.. 우끼는게.. 만약 포인터 조작에 문제가 있는거라면 두번째 방법으로 해도 안되어야 할텐데 말에여.. 음.. 하나 의심되는것은.. *(tmp+j-addsize)에서.. addsize 는 unsigned long이고.. j는 int거덩여.. 근데.. 비슷하게 쬐꾸만 예제 프로그램을 짜보니까.. 이건 또 제대루 대드라구여.. 9.01에서여.. 전에도 9.01에서 펑션 파라메타를 줄때.. float를 주면.. 이게 그 값을 제대로 못받는 경우가 있었던걸로 기억해여... 그래서 더미 파라메타를 끝에다가 하나 더 주구 .. 막.. 그러면 됐던걸루 기억하는데여.. 혹시.. 관련되는 머시기 읍슬까여? 고시기.. 730, 710하던거하고 735, 715 하던거하구 씨피유가 수퍼스칼라 기법을 사용한 PA-RISC7100으루 바낀거라는디.. 혹시 그런거에 관련된 문제는 아닐까여? 아니면.. 새로운 칩에대한 컴파일러를 잘몬 맹그러서 그런걸까여? 아.. 그리고.. 악마헝.. 알아봐 주신거 고마버여~~ :) 음.. 상용뿌로구램에는 몬쓴다.. 면.. 좀 그러쿤여.. 울회사가 한국일보하구 합병된다문.. 한국일보 기계에는 쓸수 있겟지만여.. 애고.. 힘들긴 해도.. 그 데이터 얼라인먼트 문제는.. 그 대상이 되는 화일들이 망할노무 미친토쉬서 부터 따라온거라서 문제인데.. 한번 뒤집어 엎어야져.. 무지 귀찬트라두.. 쫍.. 노가다.. 땡치루 |