Projet

Général

Profil

SOP 001-Programmation » Historique » Version 15

Patrice Nadeau, 2015-12-22 19:31

1 1 Patrice Nadeau
h1. SOP 001-Programmation
2
3
Mes standards autant au niveau du style que de la documentation.
4
5 11 Patrice Nadeau
La plate-forme (logiciel et matériel) est documenté dans le [[SOP_002-Environnement_informatique]].
6 1 Patrice Nadeau
7
{{lastupdated_at}} {{lastupdated_by}}
8
9
---
10
11
{{toc}}
12
13
h2. Diagrammes
14
15
Les représentations des différents processus d’un programme ou d’un circuit.
16
17
Les diagrammes DOIVENT être faits avec le logiciel Dia.
18
Ils PEUVENT être exportés en d’autre format.
19
20 14 Patrice Nadeau
h3. LibreOffice Draw
21
22 15 Patrice Nadeau
Icônes :
23
* Cisco : http://www.cisco.com/web/about/ac50/ac47/3015_jpeg.zip
24
* http://www.vrt.com.au/downloads/vrt-network-equipment
25 14 Patrice Nadeau
26 1 Patrice Nadeau
h2. Système de gestion de version
27
28
Le logiciel "Git":http://www.git-scm.com/ DOIT être utilisé.
29
30
La version DOIT être en format: _majeur.mineur.revision_.
31
Les nombres majeur, mineur NE DOIVENT PAS contenir de zéro non significatif et DEVRAIT se limiter à deux chiffres.
32
33
Ex.
34
> Version 1.2.06
35
36
Les modifications DOIVENT se faire avec _git commit_, de la manière suivante :
37
* nom du fichier modifié,
38
* 1 espace,
39
* nom de l’item modifié entre parenthèses,
40
* un deux- points (<notextile>:</notextile>) sans espace avec l’item précédent,
41
* 1 espace,
42
* le texte du changement en anglais, commençant par une majuscule, au présent,
43
* un point (.)
44
45
Ex. :
46
> Modification ajouté manuellement
47
<pre><code class="bash">
48
git commit -m "usart.c (usart_Init): Add a new variable ctr."
49
</code></pre>
50
> Modification par un éditeur texte
51
<pre><code class="bash">
52
git commit
53
</code></pre>
54
55
Si les commit sont fait sans l’option *-m*, chaque fichier DOIT être séparé par une ligne vide.
56
57
h2. Code source
58
59
Les différents type de langage et de script décrit dans ce SOP.
60
61
h3. Généralités
62
63
h4. Langue
64
65
La langue (macros, variables, fonctions, commentaires, etc...) DOIT être l’anglais.
66
67
h4. Commentaires
68
69
Les commentaires DOIVENT être :
70
* sur la ligne précédent l’item à documenter
71
* en minuscules et commencer par une majuscule
72
73
74
h4. Nombre magique
75
76
L’utilisation de "nombre magique":http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Unnamed_numerical_constants ne DOIT PAS être utilisé directement dans le code.
77
Il DOIVENT être définis dans une macro ou une variable globale.
78
79
h2. C
80
81
Le langage C, version C99 (ISO/IEC 9899:1999) utilisé avec le compilateur GCC.
82
83
h3. Commentaires
84
85
Les commentaires ne devant pas être inclus dans une documentation, DOIVENT être de style « C » :
86
87
<pre><code class="c">
88
/* Une seule ligne... */
89
90
...
91
92
/*
93
* Sur
94
* plusieurs
95
* lignes
96
*/
97
</code></pre>
98
99
h3. Doxygen
100
101
Chaque item DOIT être documentés de manière à générer une documentation avec le logiciel "Doxygen":http://www.stack.nl/~dimitri/doxygen/index.html.
102
103
Seulement les items définis dans les fichiers d’en-tête sont documentés par défaut.
104
Un commentaire Doxygen commence par *<notextile> /** </notextile>* , le compilateur le comprenant comme un commentaire ordinaire.
105
106
Les règles typographiques du [[SOP_000-Documentation]] s’appliquent :
107
* Gras (*@b*) : Items devant être inscrit tel quel.
108
* Italique & emphase (*@e*) : Items à remplacer par un choix ou nécessitant une attention particulière.
109 10 Patrice Nadeau
110 9 Patrice Nadeau
> Doxygen version &ge; 1.8.8 : Le bogue "737472":https://bugzilla.gnome.org/show_bug.cgi?id=737472 oblige de forcer le langage de la fonction dans l’exemple si on ne veut pas de numéro de ligne.
111 1 Patrice Nadeau
112
Les items DOIVENT être inscrit dans cet ordre :
113
<pre><code class="c">
114
/**
115 6 Patrice Nadeau
* @brief Short description
116
* @param[in,out] var Description. @n Possible values :
117
* − @b value1
118
* − @b value2
119
* @return
120
* @retval @b value Description
121
* @par Example :
122 1 Patrice Nadeau
* Example Title
123 7 Patrice Nadeau
* @code{.c}
124 1 Patrice Nadeau
* ...
125
* @endcode
126
* @pre Requirements
127
* @post Changes after the call to this function
128
* @see See also ...
129
* @note
130
* @warning
131
* @bug
132
* @todo
133
*/
134
</code></pre>
135
136
Des *@todo*, *@warning* et *@bug* supplémentaires PEUVENT être ajoutés dans le code.
137
L’item *@brief* DOIT toujours exister.
138
139
h3. Code
140
141
Le code est dans le style K&R, variante 1TBS
142
* Le « tab » DOIT être équivalent à 4 espaces.
143
* Le « backslah » DOIT être utilisé pour les lignes de plus de 80 caractères.
144
* Une instruction par ligne.
145
* Un espace avant et après un opérateur sauf pour les opérateurs « "unary":http://en.wikipedia.org/wiki/Unary_operation ».
146
147
One True Brace Style
148
<pre><code class="c">
149
int fonction (void)
150
{
151
    int x;
152
    /* the comment goes here, before the loop */
153
    if (var != 1) {
154
        x = x + 1;
155
        y++;
156
        printf("This is a long\
157
        line that should be splitted");
158
    } else {
159
        /** @warning this is a Doxygen warning */
160
        x--;
161
    }
162
    return(0);
163
}
164
</code></pre>
165
166
h4. Fichier entête
167
168
Avertissement
169
>Le gabarit template.h DOIT être utilisé.
170
171
Les fichier « header » DOIVENT contenir les déclarations des fonctions, macros et la partie « mainpage » de Doxygen.
172
173
Le nom du fichier DOIT être composé de la manière suivante :
174
* en minuscule
175
* 8 caractères maximum
176
* l’extension DOIT être *.h*
177
178
Une définition macro DOIT être faite pour éviter de ré-inclure le fichier.
179
La macro DOIT être dans le format *_fichier_h*
180
<pre><code class="c">
181
#ifndef _usart_h
182
#define _usart_h
183
...
184
#endif /*_usart.h*/
185
</code></pre>
186
187
h4. Fichier source
188
189
Le nom du fichier DOIT être composé de la manière suivante :
190
* en minuscule
191
* 8 caractères maximum
192
* l’extension DOIT être *.c*
193
194
h4. Librairies
195
196
Fichiers comprenant plusieurs déclarations et définitions reliés entre eux.
197
198
* Le nom DOIT respecter les standards ([[SOP_001-Programmation#Fichiers-Entêtes|1]] & [[SOP_001-Programmation#Fichiers-Sources|2]]) et être significatifs.
199
* Un fichier d’entête DOIT toujours exister.
200
* Les items sont précédés du nom de la librairie (minuscule) et séparés par un « underscore » (_).
201
202
L’utilisation de macros DOIT être utilisé au lieu de constates globales.
203
Il NE DEVRAIT PAS exister de de variables globales.
204
205
h4. Déclarations locales
206
207
Une déclaration n’ayant qu’une visibilité locale DOIT être précédé d’un « underscore » (_) et être de classe *static*.
208
209
<pre><code class="c">
210
/**
211
* @brief Local function
212
**/
213
static void _LocalFunc(void)
214
{
215
...
216
return;
217
}
218
</code></pre>
219
220
h4. Items désuets
221
222
Les déclarations ne devant plus être utilisés, DOIVENT générer un message lors de la compilation (*-Wall*) si un appel est effectué.
223
224
L’attribut *<notextile> __attribute__((deprecated)) </notextile>* DOIT être ajouté à la déclaration.
225
La documentation DOIT indiquer les substituts à utiliser.
226
<pre><code class="c">
227
/**
228
* @brief OldFunction
229
* @detail will generate a warning if used
230
* @see @b NewFunction
231
*/
232
int OldFunction(void) __attribute__((deprecated));
233
</code></pre>
234
235
h4. Constantes
236
237
La déclaration DOIT inclure aussi la définition.
238
239
Utilisé au lieu d’une macro quand le type ou la visibilité de la variable doit être définis.
240
* En majuscule
241
* Séparé par un «underscore» (_) si contient plusieurs mots
242
* De classe _static_ ou _extern_ selon le besoin
243
244
<pre><code class="c">
245
/** 
246
 * @name List of constants
247
 * @{
248
 */
249
250
/**
251
* @brief Local const
252
*/
253
static int _PI = 3.15;
254
/**
255
* @brief The initialization string of the project
256
*/
257
static const char INIT_STR[6] = {'P', 'O', 'W', 'E', 'R'};
258
/**
259
* @brief Global const in the random library
260
*/
261
extern int random_MAX = 25;
262
263
/**
264
 * @}
265
 */
266
</code></pre>
267
268
h4. Typedef
269
270 12 Patrice Nadeau
Format
271
* En minuscule, suivie de *_t*
272
273 13 Patrice Nadeau
Définition de typedef
274 12 Patrice Nadeau
<pre><code class="c">
275
/** Unsigned integer 8 bits */
276
typedef unsigned int new_t
277
/** Type of structure in the ds1305 library */
278
typedef struct {
279
	/** @brief last two digits : &ge; 00, &le; 99 */
280
	uint8_t year;
281
	/** @brief 01 - 12 */
282
	uint8_t month;
283
	/** @brief 01 - 31 */
284
	uint8_t date;
285
	/** @brief 1 - 7 */
286
	uint8_t day;
287
	/** @brief 00 - 23 */
288
	uint8_t hours;
289
	/** @brief 00 - 59 */
290
	uint8_t minutes;
291
	/** @brief 00 - 59 */
292
	uint8_t seconds;
293
} ds1305_time_t;
294
</code></pre>
295 1 Patrice Nadeau
296
h4. Variables
297
298
Format
299
* En minuscule.
300
* Séparé par un « underscore » (_) si contient plusieurs mots.
301
302
Définition de variables
303
<pre><code class="c">
304
/** @brief Local variable */
305
int _ctr;
306
/** @brief Global variable from the random librairy */
307
int random_ctr;
308
</code></pre>
309
310
h4. Structures
311
312
Format
313
* En minuscule, séparé par des «underscores» si nécessaire.
314
315
Définition de structures
316
<pre><code class="c">
317
/**
318
* @brief Structure for a local menu
319
* @see MenuSelect
320
*/
321
struct menu {
322
/** @brief Character used for the item */
323
char choice;
324
/** @brief Description of the item */
325
char *item;
326
};
327
</code></pre>
328
329
h4. Fonctions
330
331
Le nom est formé d’une lettre majuscule pour chacune des premières lettres des mots.
332
333
Le nom DOIT être dans un deux formats suivants :
334
* ActionItemAttribut, où _Action_ signifie :
335 5 Patrice Nadeau
** *Get* : Lis un registre
336
** *Read*, *Write* : Lis ou écris dans un fichier
337
** *Set* : Écris une valeur prédéfini dans un registre
338
** *Init* : Fonction d’initialisation
339 1 Patrice Nadeau
* isItemEtat
340 5 Patrice Nadeau
** *is* : Verifie si _Item_ est dans l’état _Etat_
341 1 Patrice Nadeau
342
Exception
343
> Les fonctions définies dans une librairie de bas niveau pour du matériel (« driver »). Dans ce cas, le nom définis dans le « datasheet » aura préséance. Ex. ReadRegister.
344
345
Une fonction DEVRAIT retourner une valeur. 
346
347
Dans le cas d'un « oui/non », la valeur DOIT être :
348
* Succès : *0* 
349
* Erreur : *1*
350
> L'utilisation d'un type booléen (*true* & *false*) est permise avec *<stbool.h>* (C99).
351
352
Dans le cas d'une fonction retournant un pointeur :
353
* Erreur : *NULL* 
354
* autre valeur  : adresse du pointeur
355
356
357
Définition de fonctions
358
<pre><code class="c">
359
/**
360
* @brief Check if a timer is set
361
* @param[in] nb Timer number. @n Possible values :
362
* − @b TIMER_1
363
* − @b TIMER_2
364
* @return
365
* @retval true Timer @e nb is set
366
* @retval false Timer @e nb is NOT set
367
* @par Example :
368
* Check if the timer is set
369
* @code{.c}
370
* ...
371
* result = isTimerSet();
372
* ...
373
* @endcode
374
* @pre TimerInit
375
**/
376
static bool isTimerSet(uint8_t nb);
377
/**
378
* @brief Set the led to green
379
**/
380
SetLedColor(GREEN);
381
/**
382
* @brief Set register of the chip XYZ
383
*
384
* The name does not follow the standards but does match the datatsheet
385
* This is a local function not meant to be called outside this librairy
386
**/
387
static void _WriteReg(void);
388
</code></pre>
389
390
h3. Macros
391
392
Les directives du préprocesseur C.
393
394
* Utilisé dans le code source et les fichiers entête.
395
* DOIT toujours commencer à la colonne 0.
396
397
h4. include
398
399
Pour inclure d’autres fichier comme les fichiers entête.
400
>N’est pas documenté dans Doxygen.
401
402
h4. ifdef / ifndef
403
404
Surtout utiliser pour des options de compilation sur différentes plateforme.
405
>N’est pas documenté dans Doxygen.
406
407
<pre><code class="c">
408
#ifndef usart_AVR
409
#error "usart.h is not supported on this AVR !"
410
#endif
411
</code></pre>
412
413
h4. error
414
415
Affiche une erreur et arrête la compilation
416
>N’est pas documenté dans Doxygen.
417
418
<pre><code class="c">
419
#ifndef __test__
420
#error "Error !"
421
#endif
422
</code></pre>
423
424
h4. #warning
425
426
Affiche une erreur mais n’arrête la compilation
427
>N’est pas documenté dans Doxygen.
428
429
<pre><code class="c">
430
#ifndef __test__
431
#warning "Warning !"
432
#endif
433
</code></pre>
434
435
h4. define 
436
437
Définis une valeur au moment de la compilation.
438
* Format
439
** En majuscule.
440
** Séparé par un «underscore» si contient plusieurs mots.
441
* Doxygen
442
** @brief
443
** @name pour les listes de macros (regroupement dans la documentation)
444
445
Définition de macros
446
<pre><code class="c">
447
/**
448
* @name Mathematical macros listed together
449
* @{
450
*/
451
/** @brief Value for PI */
452
#define _PI 3.14
453
/** @brief Another number */
454
#define _MAGIC_NUMBER 42
455
/**
456
* @}
457
*/
458
/** @brief Even parity */
459
#define usart_PARITY_EVEN 'e'
460
</code></pre>
461
462
h3. Atmel AVR
463
464
Particularités pour les micro-contrôleurs AVR d’Atmel.
465
466
* Progmem : Pour mettre une fonction en Flash au lieu de SRAM.
467
** Le nom de la fonction est suivie de *_P*.
468
* main : Ne revient jamais à un niveau supérieur.
469
** Définir la fonction main avec l’attribut *noreturn*.
470 3 Patrice Nadeau
** La boucle sans fin la plus optimisé est le *for (;;)*.
471 1 Patrice Nadeau
* Atomic : Opérations ne devant pas être interrompus.
472
473
Particularités pour AVR
474
<pre><code class="c">
475
/**
476
* @brief Progmem function
477
* @return An unsigned 8 bits integer
478
*/
479
uint_8t PrintString_P()
480 4 Patrice Nadeau
481 1 Patrice Nadeau
/* main function */
482
void main(void) __atribute__((noreturn))
483
{
484
    ...
485
    /* never return */
486
    for (;;) {
487
    }
488
}
489
490
/* atomic operations */
491
#ifndef S_SPLINT_S
492
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
493
/* 
494
* operations that must not be interupted
495
* like loading a 16 bit register with a 8 bit register 
496
*/
497
}
498
#endif
499
</code></pre>
500
501
h3. Distribution
502
503
Les fichiers suivants DOIVENT être inclus dans une distribution en format *tar.gz*.
504
* ChangeLog
505
* README
506
* Files.lst
507
* Makefile
508
* Makefile.mk
509
* LICENSE.txt
510
* *.c
511
* *.h
512
* projet.pdf (généré par Doxygen)
513
514
Avec mon makefile :
515
<pre><code class="bash">
516
make dist
517
</code></pre>
518
519
h3. Modifications
520
521
Un changement à un fichier (source ou en-tête), doit se refléter dans _Git_.
522
523
Chaque changement est fait avec :
524
<pre><code class="bash">
525
git add nom_fichier
526
git commit
527
</code></pre>
528
529
La ligne DOIT 
530
* être au temps présent
531
* être en anglais
532
* se termine par un point
533
* être dans le format suivant :
534
> La partie _section_ est facultative
535
536
<pre><code class="text">
537
fichier1 (fonction) <section>: 
538
Ajoute une description au temps présent.
539
Décrire les bogues réglés si il y en avaient.
540
</code></pre>
541
542
h3. Changelog
543
544
La somme de toutes les modification doivent apparaitre dans un fichier « changelog ».
545
> Le standard seras celui GNU : http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs
546
547
Ce fichier doit s'appeler *ChangeLog* et DOIT être généré à partir de _Git_ (les doubles espaces ne sont pas une erreur de frappe :
548
<pre><code class="bash">
549
git log --no-merges --format="%ad  %an  <%aE> %n * %B" --date=short > ChangeLog
550
</code></pre>
551
552
h3. Validation du code
553
554
Le logiciel _splint_ est utilisé.
555
* Un « typecast » DOIT être utilisé lorsque détecté.
556
* L’utilisation du typecast *void* DOIT être utilisé lorsque qu’une fonction retourne un résultat non utilisé.
557
558
h2. Makefile
559
560
h2. Nagios
561
562
h3. Plugins
563
564
https://nagios-plugins.org/doc/guidelines.html
565
566
Un message d'une ligne (< 80 caractères) DOIT être retourné via _STDOUT_ dans le format
567
> *SERVICE STATUS:* texte
568
569
Les codes de retour sont les suivants:
570
|_. Valeur |_. Service Status |_. Description |
571
| 0 | OK | Le service fonctionne |
572
| 1 | Warning | Le service fonctionne, problème avec le seuil de la valeur _Warning_ |
573
| 2 | Critical | Le service ne fonctionne pas ou problème avec le seuil de la valeur _Critical_  |
574
| 3 | Unknow | Arguments non valides ou erreur interne (fork, tcp socket)|
575
576
Les arguments suivants DOIVENT être fournis
577
* *-H* (*--hostname*) :
578
* *-w* (*--warning*) :
579
* *-c* (*--critical*) :
580
* *-V* (*--version*) :
581
* *-h* (*--help*) :
582
583
L'argument _--help_ DOIT aussi appeler l'argument _--version_.
584
585
En _C_, les fonctions suivantes DOIT être utilisées :
586
* _print_revision_ (utils.c)
587
* _print_help_
588
* _getopt_long_ (getopt.h)
589
590
h2. Puppet
591
592
h3. Généralités
593
594
Inspiré des recommandations disponible au http://docs.puppetlabs.com/guides/style_guide.html.
595
* Tabulation : 2 espaces
596
*  Largeur : 80 caractères (« backslah » (\) pour séparer une longue ligne).
597
* Commentaires : Style #
598
* Guillemets
599
** Simple : Pour une « string » sans variables.
600
** Double : Pour une « string » avec variables ayant besoin d’être extrapolé.
601
*** La variable doit être entourée des symboles *<notextile>{</notextile>* et *<notextile>}</notextile>*.
602
* Nom des ressources : DOIVENT être entouré du symbole *<notextile> ’ </notextile>*.
603
* Alignement de => : DOIT être aligné dans un même paragraphe.
604
* Ordre : Si l’attribut _ensure_ doit être inclus, il DOIT être le premier.
605
* Lien symbolique : DOIT être déclaré avec *ensure => link*
606
607
Ex. :
608
<pre><code class="ruby">
609
file { '/var/log/syslog':
610
ensure => link,
611
target => '/var/log/messages',
612
}
613
</code></pre>
614
615
* File mode : 
616
** 4 chiffres
617
** simple guillemet
618
* Variables
619
** lettres
620
** chiffres
621
** « underscore »
622
623
h3. Documentation
624
625
http://docs.puppetlabs.com/learning/modules2.html#module-documentation
626
627
Format Rdoc (http://rdoc.rubyforge.org/RDoc/Markup.html)
628
* Bloc de commentaires qui commence sur la première ligne du fichier
629
* Titre avec le symbole *<notextile>=</notextile>*
630
* Séparation avec le symbole *<notextile>-</notextile>*
631
* Emphase (mot entouré du symbole)
632
** * : gras
633
** _ : souligné
634
** + : Police de caractères pour le code
635
* Sections
636
** = Class:
637
** == Parameters:
638
** == Requires:
639
** == Sample Usage:
640
* Classe
641
** Une classe par fichier « manifest »
642
643
h2. Script
644
645
h3. Bash
646
647
<pre><code class="bash">
648
#/bin/bash
649
650
function print_revision {
651
}
652
653
function print_help {
654
    print_revision
655
}
656
</code></pre>
657
658
h3. Perl
659
660
<pre><code class="perl">
661
662
</code></pre>
663
664
h3. PowerShell
665
666
Version 4.0. Supporte :
667
* Windows 8.1 (natif)
668
* Windows Server 2012 R2 (natif)
669
* Windows 7 SP1
670
* Windows Server 2008 R2 SP1
671
* Windows Server 2012
672
673
h4. Fichier
674
675
Le fichier DOIT être composé de la manière suivante :
676
* L’extension est .ps1
677
* Une longue ligne peux être séparée avec un « back tick » (‘).
678
679
h4. Commentaires
680
681
L’aide est accéder par _Get-Help_
682
<pre>
683
#REQUIRES -Version 2.0
684
<#
685
.SYNOPSIS
686
A brief description of the function or script.
687
This keyword can be used only once in each topic.
688
.DESCRIPTION
689
A detailed description of the function or script.
690
This keyword can be used only once in each topic.
691
.NOTES
692
File Name
693
: xxxx.ps1
694
Author
695
:
696
Prerequisite
697
: PowerShell V2 over Vista and upper.
698
Copyright 2011 -
699
.LINK
700
Script posted over:
701
http://
702
.EXAMPLE
703
Example 1
704
.EXAMPLE
705
Example 2
706
#>
707
</pre>
708
709
h2. Vim
710
711
* Entête (en commentaires)
712
** Titre
713
** Last Change:
714
** Maintainer:
715
** License: This file is placed in the public domain.
716
* Autre mots reconnus
717
** BUG: (Error:)
718
** TODO:
719
** Note:
720
** FIXME
721
722
h2. Références
723
724
Références ayant servis à ce document.
725
726
"ChangeLog":http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs
727
"GNU deprecated attribute":http://gcc.gnu.org/onlinedocs/gcc-3.2.3/gcc/Type-Attributes.html