アプリ版:「スタンプのみでお礼する」機能のリリースについて

c言語の改修されたソースから改修箇所、改修箇所がある関数名を取得したいです。

今現在、数万行のソースに改修を加えているところなのですが、改修箇所が増えていくにつれどの改修がどの関数にあったか分からなくなってます。また前の人の改修もあるため、その改修がある関数も分かるようにしたいです。

改修箇所については、関数内の改修箇所の直前に連番が必ず振られています。
関数については特に目立ったルールはありません。

すみませんが、どなたかお力をお貸しください…

A 回答 (9件)

要するに、「改修箇所」が「どの関数にあるか」を探し出せばいいのですよね。

で、その手掛かりが「直前に連番」である、と。

ソースコードの記述が次の条件を満たしているなら、目視での確認は可能です。
・「直前に連番」の書式が、ある法則に従っている
・関数名(型名なども含む)が必ず行頭、それ以外のステートメントは必ずインデントされている

UNIX系のOSであればgrepコマンドなどを使って、上記の条件に従う行を抽出すればいいです。
例えば、連番の書式は「/*数字のみの文字列*/」、関数名は必ずアルファベットから始まるならば、
 grep '\(/\*[0-9][0-9]*\*/\|^[a-zA-Z]\)' file.c
みたいな感じで取り出せるでしょう。

例えば次のようなソースコード(このサイトでは先頭のスペースは表示時に詰められてしまうので、「_」に置き換えています)なら、
#include <stdio.h>

int foo()
{
____int a = 0;

____/*123456*/
____new_func();

____old_func();

____/*123457*/
____new_func2();

____old_func2();

____return 0;
}

char bar()
{
____/*234567*/
____old_func();
}

次のような感じで取り出すことができます。
int foo()
/*123456*/
/*123457*/
char bar()
/*234567*/

もちろん、関数の型名だけ独立した行
int
foo()
{
みたいな感じの記法であっても、
int
foo()
/*123456*/
/*123457*/
char
bar()
/*234567*/
のように取り出せます。
    • good
    • 0

う~ん、何となく事情はわかりましたが、


ソース管理使わず、ソースの修正を人手でマ―ジ
してます なんてことが客先に漏れると恐らく
大変なことになるので、注意しましょう。

で、きちんと修正箇所がソースに残っていて連番がバグや仕様変更と
結びついているなら、全ソースを目やエディタの検索で洗っても、20~30kなら
たいした作業ではないはずだけどなあ。

問題点はどこなんでしょう?
    • good
    • 0

> 改修箇所については、関数内の改修箇所の直前に連番が必ず振られています。



> 1.現在のソースに既に存在する修正箇所について取得は可能であるかどうか。
> (ルールは直前の連番のみ、連番についてはリスト有)
> 2.ソース内の"(過去のものを含む)修正箇所が存在する関数"の関数名を取得する方法はあるかどうか。
> 以上が私の知りたい情報であり、2が最終目標になります。


例えば
……
int hoge(……)
{
……
/*00001*/

}

ってなっているのであれば

ソースファイルを頭から読んでいって、
・関数の定義をみつけたら、取りあえずその行を保持する
・その関数内で(行頭に)「連番」をみつけたら、「連番」と「保持した行」を出力する。

で良いのでは?
関数定義や「連番」の抽出はコーディング規約等でパターン化されていると思うので正規表現を使用すればチェックできますよね?
pyhonやrubyのようなスクリプト言語を使用すればできると思います。
(sedやAWKでできるかは知らない)
更にいえばC言語でだって作れないことはないです、簡単ではないけど。


No.6さんも仰っていますが、具体例と使用可能なスクリプト言語を提示していただく必要がありますね。
    • good
    • 0

「改修箇所については、関数内の改修箇所の直前に連番が必ず振られています。

」というなら, 結局のところ行番号がわかればなんとかなるわけだからなんとかなりそうだけど.... 具体的にどうなっているかわかれば.

ただ, 厳密にいうと「関数内の改修箇所の直前に連番が必ず振られています」というだけでは「改修箇所がどこまでなのか」はわからないね.
    • good
    • 0

修正前のソースファイルが有れば、ファイル比較ツールを使えば、差異箇所が有る


ファイル名と内容・行番号は分かります。
#この方法では関数名までは無理です。

自分がソース管理ツールが無い環境で作業をする時は、予め自分が担当するソース
のバックアップをしておいて、修正前に比較して差異があれば、それを自分のPCに
保存してから修正するという方法を取ります。
ソースの保存用領域に戻す時も、そこに有るのが修正前のものと同じものかどうか
確認してから。
#複数人での開発で何度も痛い目を見た経験からの自衛策。
    • good
    • 0
この回答へのお礼

つまり、これから自分が加える修正箇所以外は取得は無理と言うことですね。分かりました…

こちらの環境では同ソースを複数人で複数箇所修正する場合もあり、その場合には先輩方にマージして頂いてから保存領域に保存する形をとっております。別ソースの場合でも似たような手法で確認が取れるのですね。ぜひ参考にさせて頂きます!

お礼日時:2018/04/12 23:26

今からソース管理をしようとした場合であれば、修正前のソースのバックアップが


残して無ければ、以前の修正状態は分からない事になります。

またバージョン管理システム(ツール)を使用すれば、修正履歴を管理ツールの履歴
機能を使用して残す事が可能ですが、数年後に追加・修正を行う場合に、開発時の
環境がそのまま残っていなければ、履歴は失われてしまいます。
新しい技術でも過信は禁物です。
    • good
    • 0
この回答へのお礼

すみません、ソース管理が大事な事は私も重々承知しております。しかし、私の立場が新人であるため今すぐにソース管理を導入するという訳にはいきません。また、質問内容からだんだん離れてる気がするので以下を確認させて下さい。

1.現在のソースに既に存在する修正箇所について取得は可能であるかどうか。(ルールは直前の連番のみ、連番についてはリスト有)
2.ソース内の"(過去のものを含む)修正箇所が存在する関数"の関数名を取得する方法はあるかどうか。
以上が私の知りたい情報であり、2が最終目標になります。

よろしくお願いします。

お礼日時:2018/04/12 22:58

>前の人が改修した部分について無視する形になると思われますが~


修正前のソースとの差が分かっていれば、最悪でも修正前の状態に戻せますが?
何を諦めると言うのでしょうか?
    • good
    • 0
この回答へのお礼

申し訳ありません、説明不足でした。
今現在のソースには既に前の人による改修が加えられており、その(前の人が改修した)改修箇所についても取得したいのです。

今から差分を取ったとしても既に手を加えられている部分は無視する形になると思ったため、先程のコメントをさせて頂きました。

お礼日時:2018/04/12 22:30

SVNやGITやHGで管理し、コミットコメントにちゃんと履歴を書くように


書式を決めましょう。

ソースの中に改修情報を残すのは止めた方が良いです。
    • good
    • 0

1)バージョン管理システム(ツール)を使用する


バージョン管理システム
ttps://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0
Visual SourceSafe、CVS、Subversion等

2)旧ソースをバックアップしておき、ファイル比較ツールを使用する
Diff(ファイル比較)ソフト
ttps://freesoft-100.com/pasokon/diff.html

WinMerge
ttps://forest.watch.impress.co.jp/library/software/winmerge/

DF
ttps://www.vector.co.jp/soft/win95/util/se113286.html

3)修正履歴をソースに記述
修正時に修正日を記述、旧ソースはコメント削除後に追加して、修正履歴を残す。
修正箇所が直ぐに分かる様に、ソースファイル先頭及び関数先頭のコメント部分に
修正日・修正内容を記述する
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
それぞれの方法ですが、前の人が改修した部分について無視する形になると思われますがそこは諦めるしか方法は無いのでしょうか…?
あと関数名の取得について何か方法は無いでしょうか…

お礼日時:2018/04/12 21:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!