ホーム   フォーラム   FAQ
 
メインメニュー
ログイン
ユーザー名:

パスワード:


パスワード紛失

Strtokenのバグ?

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 .4 .5 | 投稿日時 2011-6-10 19:23 | 最終変更
cabin  常連   投稿数: 48
以下のようなデータがあると仮定します

'AAAA,BBBB,CCCC'
これを変数Aに代入して

strtoken(変数A,1,',') を実行します。

1番目の値の取得ですので、当然結果は'AAAA'となります。

しかし、変数Aに'AAAA'のみ代入して、

strtoken(変数A,1,',') を実行すると

"Buffer overrun detected!"

となり、uniPaaSが再起動します。

'AAAA,'と代入すれば正常に値を返します。

V9までは全く問題なく値が取得されていたので、
uniPaaSで仕様が変更になったのか、それともバクなのかが不明です。

理由も分からず、2時間くらいはまってしまいました・・・

どちらにしても、現時点ではデータが1つでもトークンを必ず付けないと駄目なようです。

但し、これだけの処理では再現しません。

他にも複合的な原因がありそうなので、上記だけが原因とは限らないようです。

一度投稿すると消せないようなので、追記しておきます。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2011-6-15 9:15
05540  新米   投稿数: 19
cabinさん、こんにちは。

>他にも複合的な原因がありそうなので、上記だけが原因とは限らないようです。

とのことですが、

> strtoken(変数A,1,',') を実行すると
> "Buffer overrun detected!"
> となり、uniPaaSが再起動します。

となることはなく'AAAA'が取得されました。

Strtokenのバグではなさそうですね。


投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2011-6-15 11:14
cabin  常連   投稿数: 48
uniPaas全体的に言えるのですが、
複合的に挙動がおかしくなる場合があります。

strtokenの件もその1つで、1つの流れの中で使用しているのですが、1つずつ処理を止めていって、最終的にstrtokenの行を止めるとエラーが無くなりました。

しかし、有効にすると"Buffer overrun"が発生するので、
今ひとつすっきりしていません。

しかし、前回も申し上げたように、単体でテストすると全くの正常ということで、問題のプログラムは変数などかなり多くの定義があるので、uniPaas内部のメモリの処理に問題があるのではないかと推測しています。


その他にも、callprog()関数でも妙な動作がありました。

プログラムを追加すると、callprogで呼ばれているプログラムのリテラル番号が変化するはずですが、ごく希に変化しない場合があります。
突然プログラムの挙動がおかしくなったので気づきました。

特に、他のプログラムからプログラムをインポートした際に発生しやすいようです。

プログラムをフォルダ分けして使用していると、読込んだプログラムが途中に挿入されるのが原因かも知れません。

今回の一連の不具合は、V9で数年安定動作しているプログラムをuniPaasにコンバートしたプログラムで発生しています。

"V9Plusアプリケーション変換ユーティリティ"に問題があるのかも知れません。

いろいろと、あれっ?という場面が多いようです。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2011-6-15 11:57
cabin  常連   投稿数: 48
自己Resです

やっとStrtokenの問題が分かりました。

問題の処理は、変数に格納された日付文字列を取得する処理で、
V9までのstrtokenは、','が無い場合は、格納されている文字列のみを返していたのですが、uniPaasの場合は、変数の長さ分の文字列を返すのが原因でした。

変数 文字型300byte
文字列
"20110101<space292個>"

V9の場合、"20110101"が返る

uniPaasの場合、"20110101<space292個>"が返る
結果、dstr()に代入すると"Buffer overrun"が発生

受取った値をtrimすると正常に処理されました。

お騒がせしました。
微妙に仕様が変わっているのですね・・・
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2011-6-15 15:16
05540  新米   投稿数: 19
cabinさん、こんにちは。

こちらでも同様な現象が発生しました。

ただ
> 問題の処理は、変数に格納された日付文字列を取得する処理で、
> V9までのstrtokenは、','が無い場合は、格納されている文字列のみ> を返していたのですが、uniPaasの場合は、変数の長さ分の文字列を> 返すのが原因でした。

は、','があっても"Buffer overrun"が発生しました。

"20110101<space292個>"が返ってるんでしょうかね。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2011-6-15 15:28
cabin  常連   投稿数: 48
もしかして、変数に値を設定する際にスペースを残りの数分入れました?

実際は入れていませんので、説明不足でした。

ちょっとテストしてみます。

とにかく取得した値はtrimするのが無難なようですね
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2011-6-15 17:27
sigeno56  長老   投稿数: 336
横入りします。

> とにかく取得した値はtrimするのが無難なようですね

そうですね。私もそうしています。
文字列を何かする時は99% Trim しています。
たまーにRtrimを使う位でしょうか。
じゃなきゃ心配で。
投票数:0 平均点:0.00

  条件検索へ


Copyright (C) Magic Software Japan K.K. All Rights Reserved.
個人情報保護方針 会員規約